繁体   English   中英

Unity Container:如何通过命名空间注册和解析许多实现?

[英]Unity Container: how to register and resolve many implementations by namespace?

上下文 假设我们有以下IDocument层次结构和IFunctionary ,其职责是处理IDocument

interface IDocument { }
interface IOrder : IDocument { }
interface IBill : IDocument { }

interface IFunctionary<TDoc> where TDoc : IDocument { 
    void Treat(TDoc document); 
}

还有另一个分支:假设我们有两个阶段的文档处理,由类DocumentPreparationDocumentAcceptance描述。

class DocumentPreparation {
    public DocumentPreparation(
        IFunctionary<IOrder>[] orderFunctionaries,
        IFunctionary<IBill>[] billFunctionaries
    ) { }
}

class DocumentAcceptance {
    public DocumentAcceptance(
        IFunctionary<IOrder>[] orderFunctionaries,
        IFunctionary<IBill>[] billFunctionaries
    ) { }
}

意图 我想提供的所有实现IFunctionary<TDoc>从名称空间PreparationDocumentPreparation和的所有实现IFunctionary<TDoc>从名称空间AcceptanceDocumentAcceptance

问题 我应该如何调整Unity Container以实现这一目标?

我试过什么了 我可以检索所有必需的类型并使用不同的名称或相同的名称注册它们。 但是代码unity.Resolve<IFunctionary<IOrder>[]>("Preparation")返回IFunctionary<IOrder>所有实现,无论它们已注册的名称如何。 因此,似乎不可能使用简单的命名注册将实现分组。

最后我们得出了以下解决方案。

首先,通过UnityContainerRegistrationByConventionExtensions.RegisterTypes方法注册IFunctionary<TDoc>接口的所有实现(来自两个命名空间)。

之后,使用类似于以下代码的内容注册DocumentPreparationDocumentAcceptance类。

container.RegisterType<DocumentPreparation , DocumentPreparation>(
    new HierarchicalLifetimeManager(),
    new InjectionFactory(c => new DocumentPreparation(
        c.ResolveAll<IFunctionary<IOrder>>()
            .Where(f => {
                var typeNamespace = f.GetType().Namespace;
                return typeNamespace != null && typeNamespace == "Preparation";
            }).ToArray(),
        c.ResolveAll<IFunctionary<IBill>>()
            .Where(f => {
                var typeNamespace = f.GetType().Namespace;
                return typeNamespace != null && typeNamespace == "Preparation";
            }).ToArray())
        ));

应为DocumentAcceptance类复制此代码片段。

该解决方案包含明显的优点和缺点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM