我有一个托管在 IIS 中的 WCF 服务。该解决方案由 2 个项目组成:服务和数据。服务依赖于数据,如下所示:
Service -> Data
我一直在尝试反转依赖关系,如下所示:
Service <- Data
使用 WCF 是一件非常头疼的事情,因为 WCF 服务构造函数必须是无参数的(默认情况下)。
我听说可以使用 Ninject 及其 WCF 扩展来注入依赖项,因此我尝试将其集成到我的解决方案中,但我仍然不清楚哪个项目应该是相关文件和引用?我所做的是:
- 使用 NuGet 下载 Ninject
- 将 Ninject 添加到我的数据和服务项目中(在服务项目的 App_Start 文件夹中创建了 NinjectWebCommon 文件
- 在我的服务项目中创建一个 IDataProxy 接口
- 在我的数据项目中实现接口
- 将 IDataProxy 参数添加到 WCF 服务构造函数
- 在 .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 的依赖关系,这是我试图避免的。
一般专家的建议将不胜感激。谢谢。