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

Posted

技术标签:

【中文标题】Ninject 3、WCF服务和参数化构造函数【英文标题】:Ninject 3, WCF Service and parameterized constructor 【发布时间】:2013-05-31 09:19:20 【问题描述】:

我有一个托管在 IIS 中的 WCF 服务。该解决方案由 2 个项目组成:服务和数据。服务依赖于数据,如下所示:

Service -> Data 

我一直在尝试反转依赖关系,如下所示:

Service <- Data

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

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

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

到目前为止,我很确定我做得对。现在摇摇欲坠的部分:

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

    namespace Data
    
        public class DataInjectionModule : NinjectModule
        
            public override void Load()
            
                Bind<IResolutionRoot>().ToConstant(Kernel);
                Bind<ServiceHost>().To<NinjectServiceHost>();
                Bind<IDataProxy>().To<DataProxy>();
            
        
    
    

    我终于尝试在 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>());
    
    

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

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

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

我们将不胜感激一般专家的建议。谢谢。

【问题讨论】:

【参考方案1】:

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

你做得对吗?

*.svc 文件应该有这个代码:

Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory"

【讨论】:

以上是关于Ninject 3、WCF服务和参数化构造函数的主要内容,如果未能解决你的问题,请参考以下文章

WCF、Linq-to-SQL 和参数化构造函数

在构造函数中使用带有附加参数的 Ninject 创建实例

MVC5 和 Ninject:无参数构造函数错误

Autofac + WCF REST 4.0

通过 DI 的 WCF 构造函数服务类型

WCF 服务可以有构造函数吗?