使用Ninject扩展将依赖项注入MVC3 WCF服务
我有一个MVC3应用程序,它应该通过WCF公开一些函数。其中一些函数有依赖项,我想使用Ninject注入它们,但我必须在这里遗漏一些明显的东西,因为这不起作用。有人能给个提示吗?以下是我所做的: 1) 在我的MVC3应用程序中,我通过nuget添加了Ninject Wcf扩展 2) 我添加了一个.svc文件,如:使用Ninject扩展将依赖项注入MVC3 WCF服务,wcf,asp.net-mvc-3,ninject-extensions,Wcf,Asp.net Mvc 3,Ninject Extensions,我有一个MVC3应用程序,它应该通过WCF公开一些函数。其中一些函数有依赖项,我想使用Ninject注入它们,但我必须在这里遗漏一些明显的东西,因为这不起作用。有人能给个提示吗?以下是我所做的: 1) 在我的MVC3应用程序中,我通过nuget添加了Ninject Wcf扩展 2) 我添加了一个.svc文件,如: <%@ ServiceHost Service="MyWeb.LookupService" Factory="Ninject.Extensions.Wcf.NinjectS
<%@ ServiceHost Service="MyWeb.LookupService"
Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory"%>
4) 在App_Start/NinjectMVC3.cs中:
private static void RegisterServices(IKernel kernel)
{
string sConnection = ConfigurationManager.ConnectionStrings["SomeEntities"].ConnectionString;
// WCF
kernel.Bind<ServiceHost>().To<NinjectServiceHost>();
kernel.Bind<ISomeRepository>()
.To<AConcreteRepository>()
.WithConstructorArgument("sConnection", sConnection);
}
私有静态无效注册服务(IKernel内核)
{
string sConnection=ConfigurationManager.ConnectionString[“SomeEntities”].ConnectionString;
//周转基金
kernel.Bind().To();
kernel.Bind()
.至()
.有施工争议(“连接”,连接);
}
现在,当我访问svc时,我从Ninject获得以下异常:
System.ArgumentNullException未由用户代码处理Message=不能为空参数名称:root Source=Ninject
ParamName=根堆栈跟踪: 在中的Ninject.Infrastructure.Sure.ArgumentNotNull(对象参数,字符串名称) c:\Projects\Ninject\Maintenance2.2\Ninject\src\Ninject\Infrastructure\sure.cs:line 20 在Ninject.ResolutionExtensions.getresolutioniter(IResolutionRoot 根,类型服务,Func
2约束,IEnumerable
1参数,
中的布尔等参变量,布尔是唯一的)
c:\Projects\Ninject\Maintenance2.2\Ninject\src\Ninject\Syntax\ResolutionExtensions.cs:line
258
在中的Ninject.ResolutionExtensions.Get[T](IResolutionRoot,iParmeter[]参数)
c:\Projects\Ninject\Maintenance2.2\Ninject\src\Ninject\Syntax\ResolutionExtensions.cs:line
37
在Ninject.Extensions.Wcf.NinjectServiceHostFactory.CreateServiceHost(类型
中的服务类型,Uri[]基地址)
c:\Projects\Ninject\Maintenance2.2\Ninject.extensions.wcf\src\Ninject.extensions.wcf\NinjectServiceHostFactory.cs:line
48
位于System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(字符串
构造函数字符串,Uri[]基本地址)
位于System.ServiceModel.ServiceHostingEnvironment.HostingManager.CreateService(字符串
标准化虚拟路径)
位于System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(字符串
标准化虚拟路径)
位于System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(字符串
标准化虚拟路径)
能否尝试将受保护的无参数构造函数添加到实现类中 我猜servicehost也需要一个无参数构造函数 我查看了Ninject服务主机工厂和您提供的堆栈跟踪。在进行以下检查时,它看起来失败了:
Ensure.ArgumentNotNull((object) root, "root");
Ensure.ArgumentNotNull((object) service, "service");
Ensure.ArgumentNotNull((object) parameters, "parameters");
确保在使用NinjectServiceHostFactory时传递了所有必需的参数。值得尝试改变注册顺序
另外,请浏览以下链接,该链接解释了如何使用Ninject托管wcf服务。使用Ninject而不是Castle Windsor有什么原因吗?并不是说这是一个糟糕的选择,而是有一个很好的教程可以将Windsor连接到MVC30。谢谢,我使用Ninject是因为它是团队的选择,主要是因为它可以用于wpf、silverlight和wp7项目。我可以建议其他框架,前提是它们至少符合这些规范(无论如何,我应该以某种方式证明,就我们的目的而言,它比NJ更好……我从未使用过它,但我愿意接受建议:)。我不确定我是否理解你的意思,但是我的实现类已经有了一个使用默认连接字符串的公共默认无参数构造函数。“production”一个将通过另一个构造函数使用string参数,因此我需要我的DI将这个字符串传递给它。不管怎样,即使使用两个ctor,我也会不断出现这个错误。我认为NInject将使用服务器上的无参数构造函数来加载。您能否了解NInjectServiceHostFactory如何承载WCF服务。当然这和NInject有关。您可以使用dotpeek查看NInjectServiceHostFactory的实现。我查看了Ninject中的代码,似乎它失败了,因为某些参数无法传递。
Ensure.ArgumentNotNull((object) root, "root");
Ensure.ArgumentNotNull((object) service, "service");
Ensure.ArgumentNotNull((object) parameters, "parameters");