2

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

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

我知道 unity 是使用 DependencyResolver 注册的,所以我可以使用依赖解析器方法来获取注册类型的实例。

当我想获得简单的注册时,这很好用。

例如

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

//Instantiation 
var footballer1 = DependencyResolver.Current.GetService<IFootballer>();

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

如果我可以直接访问统一容器,我会执行以下操作:

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

//Instantiation 
unityContainer.Resolve<IFootballer, Footballer>("Attacker")

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

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

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

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

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

//Instantiation 
public HomeController(IFootballer footballer)
4

2 回答 2

5

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

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

还没有尝试过使用解析器,但它总是与ServiceLocator.

于 2013-06-06T12:05:51.787 回答
4

万一这有助于其他想要做同样事情的人,我发现以下内容:

当使用“Unity 3.0”和“Unity boostrapper for AP.NET MVC”时,我发现 UnityConfig 类公开了一个 GetConfiguredContainer 方法,您可以在其中直接访问统一容器,而无需使用依赖解析器。

来自 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
}

这样我就可以直接访问 Unity 容器以获取命名类型实例。

var footballer1 = UnityConfig.GetConfiguredContainer().Resolve<IFootballer>("Attacker");
var footballer2 = UnityConfig.GetConfiguredContainer().Resolve<IFootballer>("Defender");
于 2013-06-10T09:33:25.990 回答