Ninject 3,WCF服务和参数化构造函数

Phi*_*ins 5 architecture wcf dependency-injection ninject ninject-extensions

我在IIS中托管了WCF服务.该解决方案由2个项目组成:服务和数据.服务取决于数据,如下所示:

Service -> Data 
Run Code Online (Sandbox Code Playgroud)

我一直试图反转依赖,就像这样:

Service <- Data
Run Code Online (Sandbox Code Playgroud)

使用WCF时非常头疼,因为WCF服务构造函数必须是无参数的(默认情况下).

我听说可以使用Ninject及其WCF扩展来注入依赖项,所以我尝试将它集成到我的解决方案中,但我仍然不清楚哪个项目应该是相关的文件和引用?我做的是:

  1. 使用NuGet下载Ninject
  2. 将Ninject添加到我的数据和服务项目(在服务项目的App_Start文件夹中创建NinjectWebCommon文件)
  3. 在我的服务项目中创建一个IDataProxy接口
  4. 在我的Data项目中实现接口
  5. 将IDataProxy参数添加到WCF服务构造函数
  6. 在.svc文件标记中添加了出厂配置

到那时为止,我很确定我做得对.现在摇摇欲坠的部分:

  1. 我使用以下代码在我的数据项目中创建了一个DataInjectionModule :

    namespace Data
    {
        public class DataInjectionModule : NinjectModule
        {
            public override void Load()
            {
                Bind<IResolutionRoot>().ToConstant(Kernel);
                Bind<ServiceHost>().To<NinjectServiceHost>();
                Bind<IDataProxy>().To<DataProxy>();
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我终于尝试在NinjectWebCommon文件中注册服务(两个项目都是这样),就像那样:

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IService>().To<Service>()
            .WithConstructorArgument("IDataProxy", context => context.Kernel.Get<IDataProxy>());
    }
    
    Run Code Online (Sandbox Code Playgroud)

当我尝试启动我的服务时,我仍然得到这个:

提供的服务类型无法作为服务加载,因为它没有默认(无参数)构造函数.要解决此问题,请为该类型添加默认构造函数,或将该类型的实例传递给主机.

我有一种感觉,问题在于我没有在内核中绑定我的DataInjectionModule,但如果我尝试这样做,我必须添加从Service到Data的依赖,这是我想要避免的.

非常感谢一般专家的建议.谢谢.

小智 3

请检查您的第 6 点:“在 .svc 文件标记中添加了工厂配置。”

你做对了吗?

*.svc 文件应包含以下代码:

Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory"
Run Code Online (Sandbox Code Playgroud)