使用Unity在构造函数中解析同一接口的多个依赖项

时间:2013-12-16 10:50:28

标签: c# asp.net-mvc-4 unity-container

在使用Unity创建新对象时,我尝试使用两种不同的实现来解析单个接口上的两个依赖项。我正在使用ASP.NET MVC 4和一个具有许多依赖关系的控制器,我将在下面重新创建一个虚拟场景:

假设我们有一个看起来像这样的控制器:

public class HomeController : Controller
{
    public HomeController(IRepository repository, ISomeInterface someInterface1, ISomeInterface someInterface2, IConfiguration configuration)
    {
        // Code
    }
}

我需要能够将ISomeInterface解析为两个不同的类,并希望能够根据名称进行此操作。以下是我到目前为止在Boostrapper.cs中无法使用的内容:

var someInterface1 = new FirstImplementation();
var someInterface2 = new SecondImplementation();
container.RegisterInstance(typeof(ISomeInterface), someInterface1);
container.RegisterInstance(typeof(ISomeInterface), "someInterface2", someInterface2);

我也看过这篇文章,但这似乎也没有解决我的问题:http://unity.codeplex.com/discussions/355192我认为这是解决一个不同的问题,因为我试图自动解决2个依赖关系构造

对此问题的任何帮助将不胜感激,谢谢

2 个答案:

答案 0 :(得分:3)

你可以使用命名注册;为此,请使用名称注册类型(正如您对样本中的某个部分所做的那样):

var someInterface1 = new FirstImplementation();
var someInterface2 = new SecondImplementation();
container.RegisterInstance(typeof(ISomeInterface), "Impl1", someInterface1);
container.RegisterInstance(typeof(ISomeInterface), "Impl2", someInterface2);

然后,您可以将Dependency属性添加到用于指定相关名称的参数:

public class HomeController : Controller
{
    public HomeController(IRepository repository, 
               [Dependency("Impl1")] ISomeInterface someInterface1, 
               [Dependency("Impl2")] ISomeInterface someInterface2, 
               IConfiguration configuration)
    {
        // Code
    }
}

有关详细信息,请参阅此link

答案 1 :(得分:0)

我认为你最好将这两个参数ISomeInterface someInterface1, ISomeInterface someInterface2替换为唯一可以获得必要实现的参数。

它可能是一些继承自IEnumerable<ISomeInterface>的界面。这将允许您枚举所有需要的实现。

public interface ISomeInterfaceEnumerator : IEnumerable<ISomeInterface>
{        
}

public class HomeController : Controller
{
    public HomeController(IRepository repository, ISomeInterfaceEnumerator someInterfaces, IConfiguration configuration)
    {
        // Code
    } 
}

或许您可以使用更简单但不太灵活的方法

public interface ISomeInterfaceInstances
{
    ISomeInterface someInterface1 { get; }
    ISomeInterface someInterface2 { get; }
}

public class HomeController : Controller
{
    public HomeController(IRepository repository, ISomeInterfaceInstances someInterfaces, IConfiguration configuration)
    {
        // Code
    } 
}

这只是想法,但实施可能是各种各样的