【发布时间】:2010-11-01 01:26:02
【问题描述】:
家里有 Ninject 专家吗? :) 我最近一直在尝试将我的 WCF 服务应用程序和 Windows 窗体客户端应用程序从 Castle Windsor 依赖注入转换为 Ninject。
在 Win Forms 方面一切正常,但我在 WCF 方面遇到了问题。到目前为止,我已经了解到,我认为我需要可用于 Ninject 的 WCF 扩展,以便将 DI 与 WCF 一起使用,我已经完成并引用了这一点,但我认为在尝试解决我的服务时仍然遇到一个问题:
System.InvalidOperationException:找不到类型“WcfMemberService”,在 ServiceHost 指令中作为 Service 属性值提供,或在配置元素 system.serviceModel/serviceHostingEnvironment/serviceActivations 中提供。
我认为可以访问的代码是正确的,例如我的 WcfMemberService 如下:
ServiceModule.cs:
public class ServiceModule : NinjectModule
{
private IKernel _parentContainer;
public ServiceModule(IKernel container)
{
this._parentContainer = container;
}
public override void Load()
{
Bind<IDataContextProvider>().To<DataContextProvider>()
.WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString);
Bind(typeof(IRepository<>)).To(typeof(Repository<>));
Bind<IServiceLocator>().ToConstant(new NinjectServiceLocator(_parentContainer));
Bind<IUserService>().To<UserService>();
// ** WCF Services **
Bind<Business.Common.Wcf.Services.Contracts.IMemberServiceContract>().To<Business.Common.Wcf.Services.MemberService>().InSingletonScope().Named("WcfMemberService");
}
}
我所做的假设是,从我的 Castle Windsor 配置转换过来时,Named() 应该与 WCF .svc 文件的声明中的条目相同。所以我做了如下:
<%@ ServiceHost Language="C#" Service="WcfMemberService" Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory" %>
很简单,顺便说一下,我从 Ninject Wcf Extensions GitHub 页面 here 上的 TimeService 示例解决方案中采用了这种方法。
谁能看到我在这里做错了什么以及为什么“WcfMemberService”无法解决?它在内核中必然是“WcfMemberService”,并在@ServiceHost 声明中被引用。我看不出还有什么问题。这与我在 Castle Windsor 中的声明方式完全相同,只是语法大致不同,但两者都使用 Named() 并且都在 .svc 文件的服务部分引用该名称。
*更新*我发现如果我不使用Named() 方法,只需将@ ServiceHost 声明中的服务设置为Business.Common.Wcf.Services.MemberService, Business.Common.Wcf.Services 即可.但我仍然对为什么我不能使用命名服务感到困惑。谢谢。
顺便说一句,我的 Ninject 模块是通过 Global.asax.cs 以这种方式加载的:
public class Global : NinjectWcfApplication
{
#region Overrides of NinjectWcfApplication
/// <summary>
/// Creates the kernel that will manage your application.
/// </summary>
/// <returns>The created kernel.</returns>
protected override IKernel CreateKernel()
{
// config to reside in executing directory
log4net.Config.XmlConfigurator.Configure(new FileInfo("log4net.config"));
var _container = new StandardKernel();
_container.Load(new ServiceModule(_container));
//_container.Load(new Log4netModule());
ServiceLocator.SetLocatorProvider(() => _container.Get<IServiceLocator>());
return _container;
}
#endregion
}
【问题讨论】:
-
除非@Ian Davis 是关于,否则你最好在 Ninject 邮件列表中询问这类事情。
-
谢谢鲁本,我今天早些时候也在那里问过,所以我们看看会发生什么:)
标签: c# .net wcf ninject ninject-extensions