[英]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);
}
还有另一个分支:假设我们有两个阶段的文档处理,由类DocumentPreparation
和DocumentAcceptance
描述。
class DocumentPreparation {
public DocumentPreparation(
IFunctionary<IOrder>[] orderFunctionaries,
IFunctionary<IBill>[] billFunctionaries
) { }
}
class DocumentAcceptance {
public DocumentAcceptance(
IFunctionary<IOrder>[] orderFunctionaries,
IFunctionary<IBill>[] billFunctionaries
) { }
}
意图。 我想提供的所有实现IFunctionary<TDoc>
从名称空间Preparation
到DocumentPreparation
和的所有实现IFunctionary<TDoc>
从名称空间Acceptance
到DocumentAcceptance
。
问题。 我应该如何调整Unity Container以实现这一目标?
我试过什么了。 我可以检索所有必需的类型并使用不同的名称或相同的名称注册它们。 但是代码unity.Resolve<IFunctionary<IOrder>[]>("Preparation")
返回IFunctionary<IOrder>
所有实现,无论它们已注册的名称如何。 因此,似乎不可能使用简单的命名注册将实现分组。
最后我们得出了以下解决方案。
首先,通过UnityContainerRegistrationByConventionExtensions.RegisterTypes
方法注册IFunctionary<TDoc>
接口的所有实现(来自两个命名空间)。
之后,使用类似于以下代码的内容注册DocumentPreparation
和DocumentAcceptance
类。
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.