1

我有一个使用 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?其次,我的容器如何知道要解析哪种类型?

请帮忙....

4

2 回答 2

3

将您的两种类型注册到具有名称的容器中,即;

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

并使用名称参数解析您的类型,即;

var logger = container.Resolve<ILogger>("DBLogger");
于 2013-01-09T07:23:42.987 回答
0

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

您可以使用嵌套的 Unity 容器来实现您想要的,但您最好在自己的代码中进行解析,尤其是嵌套容器方法更适合在应用程序范围的解析方面处理“规则异常”。

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

于 2013-01-09T07:10:53.563 回答