编程语言
首页 > 编程语言> > c#-Mef2在每个模块中配置注册

c#-Mef2在每个模块中配置注册

作者:互联网

好的,所以我在使用.Net 4.5的C#WPF应用程序中使用Caliburn Micro和Mef2.我想知道是否有什么方法可以在单独的dll中配置Mef2的注册,然后在主dll中使用它们.基本上,dll将配置其自己的导入和导出.

就像是:

RegistrationBuilder builder = new RegistrationBuilder();

        builder.ForTypesDerivedFrom<IShell>().Export<IShell>().SetCreationPolicy(CreationPolicy.Shared);
        builder.ForTypesDerivedFrom<IFindProducts>().Export<IFindProducts>().SetCreationPolicy(CreationPolicy.Shared);
        builder.ForTypesMatching(t => t.Name.EndsWith("ViewModel")).Export().SetCreationPolicy(CreationPolicy.NonShared);

        return builder;

在每个dll中,但我坚持要把所有注册合并到一个RegistrationBuilder中,然后传递到每个目录中.

解决方法:

一种方法是将RegistrationBuilder传递给每个程序集进行更新.这可以通过添加如下接口来完成:

public interface IRegistrationUpdater
{
    void Update(RegistrationBuilder registrationBuilder);
}

在合同大会中.所有需要注册MEF2公约的程序集都将引用此规则.例如:

public class RegistrationUpdater: IRegistrationUpdater
{
    public void Update(RegistrationBuilder registrationBuilder)
    {
        if (registrationBuilder == null) throw new ArgumentNullException("registrationBuilder");

        registrationBuilder.ForType<SomeType>().ImportProperty<IAnotherType>(st => st.SomeProperty).Export<ISomeType>();
        registrationBuilder.ForType<AnotherType>().Export<IAnotherType>();
    }
}

SomeType实现ISomeType,AnotherType实现IAnotherType. IAnotherType不需要部分. ISomeType需要IAnotherType部分.

然后,在主程序中,您需要使用类似以下内容的文件来找到可用的IRegistrationUpdaters:

static IEnumerable<IRegistrationUpdater> GetUpdaters()
{            
    var registrationBuilder = new RegistrationBuilder();
    registrationBuilder.ForTypesDerivedFrom<IRegistrationUpdater>().Export<IRegistrationUpdater>();
    using (var catalog = new DirectoryCatalog(".", registrationBuilder))
    using (var container = new CompositionContainer(catalog))
    {
        return container.GetExportedValues<IRegistrationUpdater>();
    }  
}

然后可用于遍历每个更新程序并调用IRegistrationUpdater.Update(RegistrationBuilder).

var mainRegistrationBuilder = new RegistrationBuilder();
foreach (var updater in GetUpdaters())
{
    updater.Update(mainRegistrationBuilder);
}

var mainCatalog = new DirectoryCatalog(".", mainRegistrationBuilder);
var mainContainer = new CompositionContainer(mainCatalog);

var s = mainContainer.GetExportedValue<ISomeType>();

标签:mef,c,net,mef2
来源: https://codeday.me/bug/20191031/1972962.html