MEF コンテナーを使用できるように、Enterprise Library のデフォルトの Unity コンテナーの動作をオーバーライドしようとしています。これを行う方法の説明が記載されたリソースがいくつかありますが、私はそれを取得していません:
- http://blogs.msdn.com/b/bobbrum/archive/2009/06/23/enterprise-library-5-0-some-architecture-changes.aspx
- http://entlib.uservoice.com/forums/90505-silverlight-integration-pack/suggestions/1284693-mef-configurator-for-enterprise-library-container
- http://entlib.codeplex.com/discussions/261443
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
のコンストラクターにフィードするにはどうすればよいですか?LogWriterImpl
ExceptionManagerImpl
EnterpriseLibraryContainer.ConfigureContainer
RegisterAll
私の を呼び出しますMefContainerConfigurator
。これは、すべてのエンタープライズ ライブラリ タイプをコンテナーに登録する場所ですか?IServiceLocator
NotImplemented; として残したインターフェイスのメソッド。これらを使用してコンテナーからオブジェクトを返す方法が見つかりませんでした。それらを実装しないままにして、代わりに汎用メソッドを使用することになっていますか?
編集
私はまだこれを完全に正しくすることはできません。@Chris Tavares の回答に基づいて、TypeRegistrations を反復処理してコンテナーに追加するメソッドを記述しましたRegisterAll
。MefContainerConfigurator
私の人生では、これらを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));
}