【问题标题】:Microsoft Unity, Resolving two similar dependencies?Microsoft Unity,解决两个类似的依赖项?
【发布时间】:2013-01-09 06:58:25
【问题描述】:

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

请帮忙....

【问题讨论】:

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 创建一个带有类型名称的常量类会更好吗?我真的不喜欢在我的应用程序中使用字符串。否则,非常感谢。
  • 如果你需要一些命名注册,你可以创建一个常量类;否则你可能会创建不同的容器。
【解决方案2】:

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

您可以使用嵌套的 Unity 容器来实现您想要的,但您最好在自己的代码中进行解析,特别是嵌套容器方法更多地用于处理应用程序方面的“规则异常”-宽分辨率。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    相关资源
    最近更新 更多