使用Ninject扩展将依赖项注入MVC​​3 WCF服务

时间:2011-11-11 12:32:34

标签: 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.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,Func 2 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)

1 个答案:

答案 0 :(得分:0)

您是否可以尝试将受保护的无参数构造函数添加到您的实现类中。

猜猜servicehost也需要一个无参数的构造函数。

我查看了Ninject服务主机工厂以及您提供的堆栈跟踪。它看起来没有做出以下检查:

      Ensure.ArgumentNotNull((object) root, "root");
      Ensure.ArgumentNotNull((object) service, "service");
      Ensure.ArgumentNotNull((object) parameters, "parameters");

确保在使用NinjectServiceHostFactory时传递所有必需参数。值得尝试改变注册顺序。

还可以通过以下链接 here 解释如何使用Ninject托管wcf服务。