2016-10-05 12 views
1

私は、.NET Frameworkを.NET Coreにターゲティングするコードを移植しようとしていますが、その一部はMEF1からMEF2に切り替えることを含みます。 .NETコアでMEFを使用することについては、多くの文書がないようで、は、MEF1と同様にの部分をフィルタリングする方法を示す例は見つかりません。MEF2の部品をどのようにフィルタリングできますか?

元のコード(MEF1を使用しています)では、MockCommunicationServiceを除き、アセンブリのセットからエクスポートされたすべての部品をロードしたかったのです。私はこれを次のように実装しました:

// Filter out invalid exports. 
Func<ComposablePartDefinition, bool> partFilter = it => !it.ToString().Contains(nameof(MockCommunicationService)); 

var assemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
var catalog = new DirectoryCatalog(assemblyPath).Filter(partFilter); 
var container = new CompositionContainer(catalog); 

これはMEF2と同じでしょうか?私はそれがおそらくConventionBuilderを使用することを含むと想像しますが、 "x以外のすべてを許可する"という行に沿って規約を定義する方法があるかどうかはわかりません。

理想的には、このようなものは素晴らしいことだ:

var conventions = new ConventionBuilder(); 
conventions.ForType<MockCommunicationService>().SuppressExports(); 

var configuration = new ContainerConfiguration() 
    .WithAssemblies(assemblies, conventions); 

答えて

1

それはほとんど最適解ませんが、これは、私は当分の間使用してきました回避策です。

ContainerConfigurationためthe sourceを見ると、私はWithAssembliesは次のように定義されていることを参照してくださいので、代わりにWithAssembliesを使用するのでは、次のように私はWithPartsを使用

public ContainerConfiguration WithAssemblies(IEnumerable<Assembly> assemblies, AttributedModelProvider conventions) 
{ 
    if (assemblies == null) throw new ArgumentNullException(nameof(assemblies)); 
    return WithParts(assemblies.SelectMany(a => a.DefinedTypes.Select(dt => dt.AsType())), conventions); 
} 

// Filter out invalid exports. 
Predicate<Type> filterParts = part => !part.Equals(typeof(MockCommunicationService)); 

var parts = from name in DependencyContext.Default.GetDefaultAssemblyNames() 
      where name.Name.StartsWith("<<Company>>") 
      let assembly = Assembly.Load(name) 
      from definedType in assembly.DefinedTypes 
      let part = definedType.AsType() 
      where filterParts(part) 
      select part; 

var configuration = new ContainerConfiguration() 
    .WithParts(parts); 

return configuration.CreateContainer(); 

を繰り返しますが、これはより多くのように思えます私はこの答えを受け入れるつもりはありません。他の回答が投稿されない場合、これは他の人には役に立つかもしれません。

関連する問題