1

我正在探索 MEF2/.Net4.5(又名约定)的新的无属性注册功能。更具体地说,我正在尝试注册开放泛型:

public interface IRepository<T>
{
    T Fetch();
}

public class Repository<T> : IRepository<T>
{
    public T Fetch()
    {
        return default(T);
    }
}

public class Quotation
{

}

class Program
{
    static void Main(string[] args)
    {
       var registrationBuilder = new RegistrationBuilder();

       registrationBuilder
            .ForType<Repository<Quotation>>()
            .Export();

        registrationBuilder
            .ForTypesMatching(t => t.Name.EndsWith("ory"))
            .Export();

        registrationBuilder
            .ForType<Quotation>()
            .Export<Quotation>();

        var catalog = new AssemblyCatalog(typeof (Program).Assembly, registrationBuilder);

        foreach (var part in catalog.Parts)
        {
            Console.WriteLine(part.ToString());
        }
     }
 }

无论我使用哪种方法来注册存储库(参见代码),目录中都只包含 Quotation 类。我是否遗漏了什么,或者注册 API 中不支持开放泛型?

此致,

K·科塞利斯

4

1 回答 1

1

有可能的。据我所知,所有组合都是可能的。

属性导出 - 约定导入 约定导出 - 属性导入 约定导出 - 约定导入

为了让您的样本工作替换:

registrationBuilder
            .ForTypesMatching(t => t.Name.EndsWith("ory"))
            .Export();

和:

registrationBuilder
                .ForTypesMatching(t => t.GetInterface(typeof(IRepository<>).Name) != null)                    
                .ExportInterfaces();

当然还有其他方法可以实现ForTypesMatching谓词。请注意,您还可以过滤导出的接口。

奇怪的是,以下不起作用:

registrationBuilder
                .ForTypesDerivedFrom(typeof(IRepository<>))
                .ExportInterfaces();

我现在没有时间查看 MEF 的源代码,但是当我这样做时,我会告诉你。

于 2013-01-21T11:35:12.047 回答