我有一个MVC3应用程序,它应该通过WCF公开一些函数。其中一些函数有依赖关系,我想使用Ninject注入它们,但我必须遗漏一些明显的东西,因为这不起作用。任何人都可以提示吗?这是我做的:
1)在我的MVC3应用中,我通过nuget添加 Ninject Wcf扩展。
2)我添加 .svc文件,如:
<%@ ServiceHost Service="MyWeb.LookupService"
Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory"%>
3)我添加相应的代码(这只是一个测试,所以我在这里使用虚拟接口):
[ServiceContract]
public interface ILookupService
{
[OperationContract]
int GetProjectIdByCode(string sCode);
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class LookupService : ILookupService
{
private readonly ISomeRepository _repository;
public LookupService(ISomeRepository repository)
{
_repository = repository;
}
public int GetProjectIdByCode(string sCode)
{
//... use _repository
}
}
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);
}
现在,当我访问svc时,我从Ninject获得以下异常:
System.ArgumentNullException未被用户代码
处理 Message =不能为null参数名称:root Source = Ninject
ParamName = root StackTrace: 在Ninject.Infrastructure.Ensure.ArgumentNotNull(Object argument,String name)中 C:\项目\ Ninject \ Maintenance2.2 \ ninject \ SRC \ Ninject \基础设施\ Ensure.cs:线 20 在Ninject.ResolutionExtensions.GetResolutionIterator(IResolutionRoot root,Type service,Func2 constraint, IEnumerable
1个参数, Boolean isOptional,Boolean isUnique)in C:\项目\ Ninject \ Maintenance2.2 \ ninject \ SRC \ Ninject \语法\ ResolutionExtensions.cs:线 258 在Ninject.ResolutionExtensions.Get [T](IResolutionRoot root,IParameter []参数)in C:\项目\ Ninject \ Maintenance2.2 \ ninject \ SRC \ Ninject \语法\ ResolutionExtensions.cs:线 37 at Ninject.Extensions.Wcf.NinjectServiceHostFactory.CreateServiceHost(Type serviceType,Uri [] baseAddresses)in C:\项目\ Ninject \ Maintenance2.2 \ ninject.extensions.wcf \ SRC \ Ninject.Extensions.Wcf \ NinjectServiceHostFactory.cs:线 48 at System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(String constructorString,Uri [] baseAddresses) 在System.ServiceModel.ServiceHostingEnvironment.HostingManager.CreateService(String normalizedVirtualPath) 在System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(String normalizedVirtualPath) at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath)
答案 0 :(得分:0)
您是否可以尝试将受保护的无参数构造函数添加到您的实现类中。
猜猜servicehost也需要一个无参数的构造函数。
我查看了Ninject服务主机工厂以及您提供的堆栈跟踪。它看起来没有做出以下检查:
Ensure.ArgumentNotNull((object) root, "root");
Ensure.ArgumentNotNull((object) service, "service");
Ensure.ArgumentNotNull((object) parameters, "parameters");
确保在使用NinjectServiceHostFactory时传递所有必需参数。值得尝试改变注册顺序。
还可以通过以下链接 here 解释如何使用Ninject托管wcf服务。