我最近一直试图将WCF服务应用程序和Windows窗体客户端应用程序从Castle Windsor依赖注入转换为Ninject。
System.InvalidOperationException:找不到类型“WcfMemberService”,该类型在ServiceHost指令中作为服务属性值提供,或在配置元素System.serviceModel/serviceHostingEnvironment/serviceActivations中提供。
我所拥有的代码(例如我的WcfMemberService)是我认为正确的访问代码,如下所示:
服务模块.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");
}
}
我做的假设是,当我从温莎城堡的工作结构转换过来时
Named()
应该是您的WCF声明中的相同条目
.svc
文件。所以我做了如下工作:
<%@ ServiceHost Language="C#" Service="WcfMemberService" Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory" %>
很简单,我从Ninject Wcf Extensions GitHub页面上的TimeService示例解决方案中采用了这种方法
here
有人知道我在这里做错了什么吗?为什么“WcfMemberService”无法解决?它在内核中绑定为“WcfMemberService”,并在@ServiceHost声明中引用。我看不出还有什么问题。这与我在温莎城堡中的声明完全相同,只是语法大致不同,但两者都使用
命名()
两人都在
.svc公司
文件。
更新
*
我发现如果我不使用
接近,然后简单地设置我的服务
@ 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
}