使用ASP.NET MVC 4应用程序实例化Unity命名类型注册

Kra*_*r00 2 c# asp.net-mvc ioc-container inversion-of-control unity-container

我想了解如何解决MVC4应用程序中的统一命名类型注册。

我正在使用“ Unity 3.0”和“ ASP.NET MVC的Unity Boostrapper”。

我了解到Unity已在DependencyResolver中注册,因此我可以使用依赖项解析器方法来获取已注册类型的实例。

当我想找回简单的注册时,此方法很好用。

例如

//Registration
container.RegisterType<IFootballer, VanPersey>();

//Instantiation 
var footballer1 = DependencyResolver.Current.GetService<IFootballer>();
Run Code Online (Sandbox Code Playgroud)

但是在某些情况下,当我想获取对命名类型注册的引用时,似乎IDependencyResolver接口没有提供适当的方法来获取命名类型注册实例。

如果我可以直接访问unity容器,则可以执行以下操作:

//Registration 
container.RegisterType<IFootballer, VanPersey>("Attacker" );
container.RegisterType<IFootballer, NemanjaVidic>("Defender");

//Instantiation 
unityContainer.Resolve<IFootballer, Footballer>("Attacker")
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,为了获得命名注册的实例,在MVC应用程序中使用unity的最合适方法是什么。即可以进入统一容器吗?

请注意,此问题不适用于任何生产实现,我正在研究Unity(以及首次使用IoC容器)并希望获得更好的理解。

我了解在生产中,我很可能会通过控制器构造函数传递依赖关系,这实际上使我想到了另一个问题。

在以下示例中,使用控制器构造函数注入时,如何指示要解析的命名类型:

//Registration 
container.RegisterType<IFootballer, VanPersey>("Attacker" );
container.RegisterType<IFootballer, NemanjaVidic>("Defender");

//Instantiation 
public HomeController(IFootballer footballer)
Run Code Online (Sandbox Code Playgroud)

Wik*_*hla 5

很有可能容器本身也已注册,以便解析器可以解析它:

var container = DependencyResolver.Current.GetService<IUnityContainer>();
var vanPersey = container.RegisterType<IFootballer, VanPersey>("Attacker" );
Run Code Online (Sandbox Code Playgroud)

尚未尝试使用解析器,但始终使用解析器ServiceLocator