我在IIS中托管了WCF服务。该解决方案由2个项目组成:服务和数据。服务取决于数据,如下:
Service -> Data
我一直试图反转依赖关系,如下:
Service <- Data
使用WCF非常令人头疼,因为WCF服务构造函数必须是无参数的(默认情况下)。
我听说可以使用Ninject及其WCF扩展来注入依赖项,所以我尝试将它集成到我的解决方案中,但我仍然不清楚哪个项目应该是相关文件和引用?< / strong>我做的是:
到那时为止,我很确定我做得对。现在摇摇欲坠的部分:
我使用以下代码在我的数据项目中创建了一个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的依赖,这就是我正在尝试的避免。
非常感谢一般专家的建议。谢谢。
答案 0 :(得分:3)
请检查您的观点6:“在.svc文件标记中添加了出厂配置。”
你做得好吗?
* .svc文件应该包含以下代码:
Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory"