c# - 如何将 Fluent MEF 注入(inject) WCF

标签 c# .net wcf dependency-injection mef

我正在尝试使用流畅配置的 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))示例使用了强耦合的实例提供程序,即 MyServiceType1InstanceProviderMyServiceType2InstanceProvider - 但如果我有许多服务与流利的 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/

相关文章:

C# Absolute URI 从 URL 中删除 ".."

c# - 在泛型方法中仅设置第二个参数类型

windows - NetTcpBinding(读取 WindowsStreamSecurityBindingElement)如何加密/签署消息?

使用 Ninject Dispose 的 WCF 未在 requestscope 中触发

c# - Interlocked.CompareExchange 在 dapper .net 方法中用于什么?

c# - 使用 Win MMDevice API 使特定音频输入静音

c# - 我需要在 C# 中创建二维数组

c# - 显示对话框时出现 "Thread was being aborted"异常

c# - 在 WCF 服务中将委托(delegate)人从客户端获取到服务器

c# - 在 ASP.Net Core 2.0 中导出到 Excel