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)
很有可能容器本身也已注册,以便解析器可以解析它:
var container = DependencyResolver.Current.GetService<IUnityContainer>();
var vanPersey = container.RegisterType<IFootballer, VanPersey>("Attacker" );
Run Code Online (Sandbox Code Playgroud)
尚未尝试使用解析器,但始终使用解析器ServiceLocator。