Microsoft.Composition(MEF2)约定和Open Generics

时间:2014-12-12 11:06:03

标签: c# mef2

我有一个类型

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")

但除非我实际为每个队列创建具体类型,否则这将不起作用,这是我不想要做的。

有办法做到这一点吗?

1 个答案:

答案 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()返回用于构建容器的程序集)