3

わかりましたので、C# WPF アプリで .Net 4.5 を使用して 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に含まれていますが、すべての登録を1つのRegistrationBuilderにマージしてから各カタログに渡すという点で立ち往生しています。

4

1 に答える 1

4

アプローチは、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で。部品はいらない。パートが必要です。AnotherTypeIAnotherTypeIAnotherTypeISomeTypeIAnotherType

次に、メイン プログラムで、次のようなものを使用して、利用可能な 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>();
于 2013-03-29T15:26:12.523 に答える