我正在尝试使用流畅配置的 MEF 通过自定义构造函数来增强我的 WCF 服务。
如何检查 MEF 容器是否提供“serviceType”。例如:
public class MyServiceHostFactory : ServiceHostFactory
{
private readonly CompositionContainer container;
public MyServiceHostFactory()
{
this.container = MyCompositionRoot.Instance.Container;
}
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
if (serviceType == ????)
{
return new MyServiceHost(container, serviceType, baseAddresses);
}
return base.CreateServiceHost(serviceType, baseAddresses);
}
}
然后我需要为我的行为添加一个实例提供者:
public MyServiceHost(CompositionContainer container, Type serviceType,
params Uri[] baseAddresses) : base(serviceType, baseAddresses)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
var contracts = this.ImplementedContracts.Values;
foreach (var c in contracts)
{
// Should I get the service obj here?
var serviceObj = container.GetExports(serviceType, null, null).First().Value;
var instanceProvider = new MyInstanceProvider(serviceObj); // ????
c.Behaviors.Add(instanceProvider);
}
}
但我不确定这个实例提供者应该是什么样子(它应该将 serviceType
作为参数还是 serviceObj
?
public partial class MyInstanceProvider : IInstanceProvider, IContractBehavior
因为在书中(.NET 中的 DI 注入(inject))示例使用了强耦合的实例提供程序,即 MyServiceType1InstanceProvider
、MyServiceType2InstanceProvider
- 但如果我有许多服务与流利的 mef Hook 。
最佳答案
一种方法是使用 GetExports CompositionContainer
的方法| .它返回 IEnumerable<Lazy<Object, Object>>
.如果它包含至少一个元素,则“serviceType”可用。
所以检查可以是:
if (container.GetExports(serviceType, null, null).Any())
{
return new MyServiceHost(container, serviceType, baseAddresses);
}
那么获取导出服务的方法可以是:
Object seviceObj = container.GetExports(serviceType, null, null).First().Value;
现在的问题是值是 System.Object 类型,你必须强制转换它吗 dynamically或使用 dynamic
关键字(并失去编译器的所有帮助)。
关于c# - 如何将 Fluent MEF 注入(inject) WCF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17352404/