2

MEF コンテナーを使用できるように、Enterprise Library のデフォルトの Unity コンテナーの動作をオーバーライドしようとしています。これを行う方法の説明が記載されたリソースがいくつかありますが、私はそれを取得していません:

SO にもこの投稿がありますが、LogWriter保護されているためコードはコンパイルされません。これは古いバージョンを指していると思います:

私が理解しているのCommonServiceLocatorは、MEF コンテナーに を使用し、これを Enterprise Library コンテナーにアタッチする必要があるということです。コンテナ コンフィギュレータには次のようなものがあります。

public class MefContainerConfigurator : IContainerConfigurator, IServiceLocator
{
    [Import] private CatalogExportProvider provider;

    public object GetService(Type serviceType)
    {
            throw new NotImplementedException();   
    }

    public object GetInstance(Type serviceType)
    {
        return provider.GetExportedValue<Type>();
    }

    public object GetInstance(Type serviceType, string key)
    {
        throw new NotImplementedException();
    }

    public IEnumerable<object> GetAllInstances(Type serviceType)
    {
        throw new NotImplementedException();
    }

    public TService GetInstance<TService>()
    {
        return provider.GetExportedValue<TService>();
    }

    public TService GetInstance<TService>(string key)
    {
        return provider.GetExportedValue<TService>(key);
    }

    public IEnumerable<TService> GetAllInstances<TService>()
    {
        return provider.GetExportedValues<TService>();
    }

    public void RegisterAll(IConfigurationSource configurationSource, ITypeRegistrationsProvider rootProvider)
    {
        throw new NotImplementedException();
    }
}

そして私のブートストラッパーで:

var configurator = new MefContainerConfigurator();
// Does this line read the Enterprise Library configuration from the app.config?
IConfigurationSource cs = new SystemConfigurationSource();

EnterpriseLibraryContainer.ConfigureContainer(configurator, cs);

これらには構成を受け入れるコンストラクターがあるため、クラスLogWriterImplとクラスを使用する必要があると思います。ExceptionManagerImplこの時点での私の質問は次のとおりです。

  • から構成を取得し、およびコンストラクターIConfigurationSourceのコンストラクターにフィードするにはどうすればよいですか?LogWriterImplExceptionManagerImpl
  • EnterpriseLibraryContainer.ConfigureContainerRegisterAll私の を呼び出しますMefContainerConfigurator。これは、すべてのエンタープライズ ライブラリ タイプをコンテナーに登録する場所ですか?
  • IServiceLocatorNotImplemented; として残したインターフェイスのメソッド。これらを使用してコンテナーからオブジェクトを返す方法が見つかりませんでした。それらを実装しないままにして、代わりに汎用メソッドを使用することになっていますか?

編集

私はまだこれを完全に正しくすることはできません。@Chris Tavares の回答に基づいて、TypeRegistrations を反復処理してコンテナーに追加するメソッドを記述しましたRegisterAllMefContainerConfigurator私の人生では、これらをAggregateContainer自分のクラスで作成されたものにマージして、Bootstrapperこれらのエクスポートを外部で実際に使用できるようにする方法を理解することはできませんContainerConfigurator

public void RegisterAll(IConfigurationSource configurationSource, ITypeRegistrationsProvider rootProvider)
{
    var registrations = rootProvider.GetRegistrations(configurationSource);

    foreach (var type in registrations)
    {
        var builder = new RegistrationBuilder();

        builder.ForType(type.ServiceType).Export();

        var cat = new AssemblyCatalog(type.ServiceType.Assembly, builder);
        var container = new CompositionContainer(cat);
        container.ComposeParts(this);
    }
}

Prism ブートストラップで ConfigureAggregateCatalog:

protected override void ConfigureAggregateCatalog()
{
    AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(RegionNames).Assembly));
    // Module assemblies
    AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(DataEntryModule).Assembly));
    AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(ReportingModule).Assembly));
    AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(StatusBarModule).Assembly));
    AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(SplashScreenModule).Assembly));
    AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(WelcomeModule).Assembly));
    AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(AdministrationModule).Assembly));

    AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Bootstrapper).Assembly));
}
4

1 に答える 1

1

あなたのコンテナ コンフィギュレータはひどく不完全です。実装するメソッドが 1 つあります: RegisterAll ですが、実装していません。

config から生の構成情報を読み取る必要はありません。代わりに、EnterpriseLibraryContianer.ConfigureContainer を呼び出すと、Entlib が構成ソースを調べて重要なビットをすべて取り出し、一連の TypeRegistration オブジェクトを渡します。それらの人は、型のマッピングやコンストラクターの依存関係などを提供します。基本的には、依存関係をコンテナー (この場合は MEF) に登録するために必要なすべてのものです。

したがって、基本的に行う必要があるのは、抽象的な TypeRegistration オブジェクトを MEF の適切な構成に変換するコードを記述することです。

Unity はこの点で特別なものではありません。コンフィギュレーターもあり、まったく同じプロセスに従っているため、必要な作業の例として entlib コードを調べることができます。

私は MEF API についてまったく知らないので、残念ながら特定の実装についてはお手伝いできません。

于 2013-02-23T01:27:38.403 に答える