2011-06-20 7 views
1

MEFカタログに動的に(リフレクションを使用して)タイプを追加しようとしており、実行時にエクスポートコントラクトを定義しようとしています。問題は、MEFは契約の完全修飾名を契約に使用するだけなので、輸出契約を特定のインタフェースタイプとして指定する必要があります。ここで実行時定義のコントラクトを使用してMEFエクスポートを動的に登録

私はMEFカタログに追加する必要があるの種類を取得するために使用するコードは次のとおりです。

private void RegisterSupportedRepositories(Func<ObjectContext> contextProvider) 
    { 
     var context = contextProvider(); 
     var properties = context.GetType().GetProperties(); 
     var entitySets = properties.Where(property => property.PropertyType.Name == typeof(ObjectSet<>).Name); 

     foreach (var entitySet in entitySets) 
     { 
      var entityType = entitySet.PropertyType.GetGenericArguments()[0]; 
      var repositoryType = typeof(EFRepository<>).MakeGenericType(entityType); 
      ComponentServices.RegisterComponent(repositoryType);     
     } 
    } 

ComponentServices.RegisterComponentは以下に定義され、それが関連していないところから(AggregateCatalogを取得)、その後、集約カタログにTypeCatalogsを追加します。

public static void RegisterComponent(Type componentType) 
    { 
     var catalog = RetrieveCatalog(); 

     catalog.Catalogs.Add(new TypeCatalog(componentType)); 
    } 

が、私は、これは希望、インタフェースとして追加タイプの契約を指定できるようにする必要があります通常はこのように見えるのエクスポート属性で行われる:

[Export(typeof(IRepository<Customer>))] 

質問である輸出が上ではなくデフォルトの「EFRepository」契約MEFを示しているものと同等であるように、私は、動的にこの輸出契約を追加するにはどうすればよいです型自体から推論する。

答えて

1

MEFのCodePlexプレビュー版を使用できる場合は、新しいRegistrationBuilderを使用することをお勧めします。 MEF's Convention Model

のメソッドを使用して独自のパーツ定義を作成し、それを使用するカタログ実装を作成することができます。

+0

Daniel、私に正しい道を教えてくれてありがとう、私はReflectionModelServicesとAttributedModelServicesの両方を使用する独自の型カタログを作成しました。今では、MEFに非帰属型を動的に追加することができます。 – Xacron

関連する問題