微软统一,解决两个类似的依赖

本文关键字:两个 依赖 解决 微软 | 更新日期: 2023-09-27 17:51:01

我有一个使用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));
    }
}

这将被注入到我的Authentication Service的构造函数中。然而,如果我想在我的应用程序的不同点使用两个记录器,首先我注册两种类型在我的Init方法,即TextLogger和DBLogger?其次,我的容器如何知道要解析哪个类型?

请帮…

微软统一,解决两个类似的依赖

用名称将这两种类型注册到容器中,即;

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

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

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

除非您使用嵌套容器并自己调用Resolve,否则Unity将提供应用范围的分辨率,而不是场景驱动的分辨率。

你可以使用嵌套的Unity容器来实现你想要的,但你最好在自己的代码中做分辨率,特别是嵌套容器方法更适合处理应用范围分辨率方面的"规则例外"。

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