如何将多个依赖项注入控制器?

时间:2014-05-01 12:15:34

标签: c# dependency-injection mocking unity-container moq

我正在使用Unity库来使用依赖注入。我有一个控制器(产品),下面是构造函数代码

public ProductController(IService1 ser1,IService2 ser2,IService3 ser3,IService4 ser4)
{
    this._Service1 = ser1;
    this._Service2 = ser2;
    this._Service3 = ser3;
    this._Service4 = ser4;
}

以下是该控制器的单元测试代码。它是将4个服务类对象注入该控制器的构造函数。

  ProductController _productController;
  Mock<IService1> _ser1Mock;
  Mock<IService2> _ser2Mock;
  Mock<IService3> _ser3Mock;
  Mock<IService4> _ser4Mock;

  if(_productController!=null)
  {
     _productController = new ProductController(
         _ser1Mock.Object,_ser2Mock.Object,_ser3Mock.Object,_ser4Mock.Object) 
  }

这里我将多个依赖项(服务)对象注入到控制器的构造函数中。并且单元测试方法运行良好。但是当我运行应用程序时它就不起作用了。

它给出错误500&#39;。

我想知道如果你有多个依赖项你应该做什么,并且你想将这些依赖项注入controller.Do我们需要单独注入或者我们可以注入一次(就像我上面做的那样)。

以下是Bootstrapper文件代码     使用System.Web.Mvc;     使用Microsoft.Practices.Unity;     使用Unity.Mvc4;

public static class Bootstrapper
{
    public static IUnityContainer Initialise()
    {
        var container = BuildUnityContainer();

        DependencyResolver.SetResolver(
            new UnityDependencyResolver(container));

        return container;
    }

    private static IUnityContainer BuildUnityContainer()
    {
        var container = new UnityContainer();
        RegisterTypes(container);
        return container;
    }

    public static void RegisterTypes(IUnityContainer container)
    {
        container.RegisterType<IService1Dal,Service1Dal>();
        container.RegisterType<IService1,Service1>();
        container.RegisterType<IService2Dal,Service2Dal>();
        container.RegisterType<IService2,Service2>();
        container.RegisterType<IService3Dal,Service3Dal>();
        container.RegisterType<IService3,Service3>();
        container.RegisterType<IService4Dal,Service4Dal>();
        container.RegisterType<IService4,Service4>();    
    }
}

1 个答案:

答案 0 :(得分:0)

您需要确保解析所需内容,以便Unity注入内容,在顶层执行此操作后,您不应再次明确使用container。检查你是这样创建的:

_productController = container.Resolve<IProductController>();

此外,您应该在Unity中注册ProductController ......

container.RegisterType<IProductController, ProductController>();