【问题标题】:Unity: Injecting Service from parent into childUnity:将服务从父级注入子级
【发布时间】:2013-02-19 17:54:14
【问题描述】:

如果我有以下类结构:

public AContainer : IContainer
{
    public AContainer(ILogger log, IDataService dataService)

    ....         
}

public BContainer : IContainer
{
    public BContainer(ILogger log, IDataService dataService)

    ....         
}

public DataService : IDataService
{
    public DataService(ILogger log, ISomethingElse somethingElse, IWhatever whatever)

    ....
}

我想注册同一个 DataService 的两个不同实例——一个注入 AContainer,一个注入 BContainer——同时将 AContainer 的日志注入其 DataService 并将 BContainer 的日志注入其 DataService。

似乎有一条路线引导我使用 ResolvedParameter 注册完整结构,这让我感觉不舒服,因为我需要将 ISomethingElse 和 IWhatever 与 Container 一起注册。

另一条路线将我引向属性注入,这通常是不鼓励的,但在这里可能有一席之地。

那么在 IoC 中是否存在此类问题的常见模式,Unity 是否支持?

【问题讨论】:

    标签: .net unity-container ioc-container


    【解决方案1】:

    也许 Unity 的 PerResolveLifetimeManager 可以帮助您。如果 ILogger 配置为 PerResolveLifetimeManager,则每个注入链仅创建一个实例。

    使用此 Life-Time Manager Unity 在解析 DataService 时创建一个新的 Logger(并且在解析 AContainer 时解析 DataService 以注入 AContainer),并注入相同的创建LoggerAContainer

    当您解析BContainer 时,将创建一个新的DataService 和一个新的Logger。这个新的logger 将被注入这个新的DataServiceBContainerDataService 将被注入到BContainer

    结果将是:

    2 个不同的 ContainersAContainerBContainer。 2 个不同的DataServices:每个容器一个。 2 个(不是 4 个)LoggersAContainer 与其 DataService 共享记录器,BContainer 与其 logger 共享其他 logger

    【讨论】:

    • 终于有机会试一试,它本来可以工作的,除了我们的 Logger 被解析为属性注入,在容器都生成之后。 Unity Child Containers最终给了我一个解决方案,但无论如何感谢您的回答;它帮助我走上了正确的道路。
    猜你喜欢
    • 2019-03-07
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2016-07-06
    • 2016-08-09
    • 1970-01-01
    • 2019-06-15
    相关资源
    最近更新 更多