1

.NET Framework をターゲットとするコードから .NET Core にコードを移植しようとしていますが、これには MEF1 から MEF2 への切り替えが含まれます。.NET Core での MEF の使用に関するドキュメントはそれほど多くないようです。また、MEF1 で可能だったようにパーツを除外する方法を示す例も見つかりませ

元のコード (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 では何ですか? おそらく を使用する必要があると思いますが、「 xConventionBuilder以外のすべてを許可する」という行に沿って規則を定義する方法があるかどうかはわかりません。

理想的には、次のようなものが素晴らしいでしょう:

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

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

1 に答える 1

1

これは最適な解決策とは言えませんが、これが当面の回避策です。

のソースを見ると、次のように定義されContainerConfigurationていることがわかります。WithAssemblies

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);
}

したがって、を使用する代わりに、次のようWithAssembliesに使用WithPartsします。

// 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();

繰り返しますが、これは適切な方法というよりもハックな回避策のように思われるため、この回答を受け入れるつもりはありません。ただし、他の回答が投稿されない場合、これは他の人にとって役立つかもしれません。

于 2016-10-07T07:00:26.663 に答える