アプローチは、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>();