C# 使用ASP.NET MVC 4应用程序实例化统一命名类型注册

C# 使用ASP.NET MVC 4应用程序实例化统一命名类型注册,c#,asp.net-mvc,inversion-of-control,unity-container,ioc-container,C#,Asp.net Mvc,Inversion Of Control,Unity Container,Ioc Container,我想了解如何在MVC4应用程序中解析unity命名类型注册 我正在使用“Unity 3.0”和“Unity boostrapper for ASP.NET MVC” 我知道unity是用DependencyResolver注册的,因此我可以使用DependencyResolver方法来获取注册类型的实例 当我想要得到一个简单的注册时,这很好用 e、 g //Registration container.RegisterType<IFootballer, VanPersey>();

我想了解如何在MVC4应用程序中解析unity命名类型注册

我正在使用“Unity 3.0”和“Unity boostrapper for ASP.NET MVC”

我知道unity是用DependencyResolver注册的,因此我可以使用DependencyResolver方法来获取注册类型的实例

当我想要得到一个简单的注册时,这很好用

e、 g

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

//Instantiation 
var footballer1 = DependencyResolver.Current.GetService<IFootballer>();
//注册
container.RegisterType();
//实例化
var footballer1=DependencyResolver.Current.GetService();
但是,当我想获取对命名类型注册的引用时,idependencysolver接口似乎没有提供获取命名类型注册实例的适当方法

var footballer1 = UnityConfig.GetConfiguredContainer().Resolve<IFootballer>("Attacker");
var footballer2 = UnityConfig.GetConfiguredContainer().Resolve<IFootballer>("Defender");
如果我可以直接访问unity容器,我将执行以下操作:

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

//Instantiation 
unityContainer.Resolve<IFootballer, Footballer>("Attacker")
//注册
container.RegisterType(“攻击者”);
container.RegisterType(“Defender”);
//实例化
unityContainer.Resolve(“攻击者”)
所以我的问题是,在MVC应用程序中使用unity来获得命名注册的实例,最合适的方法是什么。有进入统一号集装箱的通道吗

请注意,这个问题不适用于任何生产实现,我正在研究Unity(和IoC容器,这是第一次)并联系以获得更好的理解

我知道在生产中,我很可能会通过控制器构造函数传递依赖项,这实际上导致了另一个问题

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

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

//Instantiation 
public HomeController(IFootballer footballer)
//注册
container.RegisterType(“攻击者”);
container.RegisterType(“Defender”);
//实例化
公共控球员(IFootballer足球运动员)

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

var container = DependencyResolver.Current.GetService<IUnityContainer>();
var vanPersey = container.RegisterType<IFootballer, VanPersey>("Attacker" );
var container=DependencyResolver.Current.GetService();
var vanPersey=container.RegisterType(“攻击者”);

我没有尝试过使用解析程序,但使用
ServiceLocator

时,它总是像这样工作。如果这有助于其他想要做同样事情的人,我发现以下几点:

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

//Instantiation 
unityContainer.Resolve<IFootballer, Footballer>("Attacker")
在使用“Unity 3.0”和“Unity boostrapper for AP.NET MVC”时,我发现在UnityConfig类中,它公开了一个GetConfiguredContainer方法,在该方法中,您可以直接访问Unity容器,而不必使用依赖项解析程序

UnityConfig中的代码片段

/// <summary>
/// Specifies the Unity configuration for the main container.
/// </summary>
public class UnityConfig
{
    #region Unity Container
    private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() =>
    {
        var container = new UnityContainer();
        RegisterTypes(container);
        return container;
    });

    /// <summary>
    /// Gets the configured Unity container.
    /// </summary>
    public static IUnityContainer GetConfiguredContainer()
    {
        return container.Value;
    }
    #endregion
}
//
///指定主容器的统一配置。
/// 
公共类UnityConfig
{
#区域统一容器
私有静态惰性容器=新惰性(()=>
{
var container=new UnityContainer();
注册类型(容器);
返回容器;
});
/// 
///获取已配置的Unity容器。
/// 
公共静态IUnityContainer GetConfiguredContainer()
{
返回容器。值;
}
#端区
}
因此,我可以直接访问Unity容器以获得命名类型实例

var footballer1 = UnityConfig.GetConfiguredContainer().Resolve<IFootballer>("Attacker");
var footballer2 = UnityConfig.GetConfiguredContainer().Resolve<IFootballer>("Defender");
var footballer1=UnityConfig.GetConfiguredContainer().Resolve(“攻击者”);
var footballer2=UnityConfig.GetConfiguredContainer().Resolve(“Defender”);