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