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

可能です。私が見た限りでは、すべての組み合わせが可能です。

属性のエクスポート-コンベンションのインポートコンベンションのエクスポート-属性のインポートコンベンションのexpot-コンベンションのインポート

サンプル作業を置き換えるには:

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 に答える