我有一个类型
public class Queue<T> : IQueue
{
....
}
我可以使用
导出[Export(typeof(Queue<>))]
这将使我能够使用
导入[Import] Queue<StockController>
[Import] Queue<FileController>
但是,我想将这些类型导入为
[ImportMany] IQueue
如果不为每个队列创建具体类型,这似乎是不可能的。
我想使用约定来提供这些导出,并为每个导出添加元数据。我对如何添加元数据很好,但我不确定如何提供导出。基本上我想要的是像(伪代码)
conventions.
ForType(typeof(Queue<StockContoller>)).Export<IQueue>(x => x.AddMetadata("Name", "StockQueue")
ForType(typeof(Queue<FileContoller>)).Export<IQueue>(x => x.AddMetadata("Name", "FileQueue")
但除非我实际为每个队列创建具体类型,否则这将不起作用,这是我不想要做的。
有办法做到这一点吗?
答案 0 :(得分:1)
原来解决方案是两部分。首先,将零件添加到容器中,然后定义约定。这是实现此目的的扩展方法。
public static ContainerConfiguration WithQueue(
this ContainerConfiguration config,
Type queueType,
string queueName)
{
var conventions = new ConventionBuilder();
conventions
.ForType(queueType)
.Export<IQueue>(x => x.AddMetadata("QueueName", queueName));
return config.WithPart(queueType, conventions);
}
用法:
CompositionHost container =
new ContainerConfiguration()
.WithQueue(typeof(ControllerQueue<StockMovementController>), "StockMovements")
.WithAssemblies(GetAssemblies())
.CreateContainer();
(其中GetAssemblies()返回用于构建容器的程序集)