在使用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个依赖关系构造
对此问题的任何帮助将不胜感激,谢谢
答案 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
}
}
这只是想法,但实施可能是各种各样的