Microsoft Unity,解决两个类似的依赖关系?

时间:2013-01-09 06:58:25

标签: c# dependency-injection inversion-of-control unity-container containers

我有一个使用Unity的场景,这有点令人困惑......假设我有一个AuthenticationService来验证用户,并且成功使用TextLogger类或DbLogger类成功登录到文本文件或数据库。通常,我将在我的项目中使用的类我将在我的模块类中正确注册,如下所示:

public class LoggingModule
{
    IUnityContainer _iocContainer;

    public LoggingModule(IUnityContainer container)
    {
        _iocContainer = container;
    }

    public void Init()
    {
        //Add any logic here to look in a config file, check a property
        //or any other condition to decide which implementation is registered.

        //register the database logger to the ILogger interface
        _iocContainer.RegisterType(typeof(ILogger), typeof(DBLogger));

    }
}

这将被注入我的身份验证服务的构造函数中。但是,如果我想在我的应用程序中的不同点使用两个记录器,首先在Init方法中注册两种类型,即TextLogger和DBLogger? 其次,我的容器如何知道要解决哪种类型?

请帮忙......

2 个答案:

答案 0 :(得分:3)

将这两种类型注册到名称为容器的容器中,即<; p>

container.RegisterType<ILogger, DBLogger>("DBLogger");
container.RegisterType<ILogger, TextLogger>("TextLogger");

并使用name参数解析您的类型,即。;

var logger = container.Resolve<ILogger>("DBLogger");

答案 1 :(得分:0)

除非您使用嵌套容器并自己调用Resolve,否则Unity将提供应用程序范围的解决方案,而非场景驱动的解决方案。

您可以使用嵌套的Unity容器实现您想要的功能,但您可能最好在自己的代码中执行解决方案,尤其是嵌套容器方法更适用于应用“规则的例外” - 广泛的分辨率。

您需要一段代码来确定哪种具体类型适合每个实例。然后可以将此代码推送到更高级别的控制/编排类中,该类将相应的具体类型注入到从属实例中。