私は、アセンブリのカタログを設定している:発見と構成を2つの別々の懸念事項として管理するにはどうすればよいですか?
private CompositionContainer GetContainer() {
// initialize directory info
ExtensionDirectory = new DirectoryInfo(settings.ExtensionsPath);
// directory catalog
var dirCatalog = new DirectoryCatalog(ExtensionDirectory.FullName);
return new CompositionContainer(dirCatalog);
}
予想通り、コンテナの中身は、ディレクトリ内のすべてのアセンブリをロードします。依存関係が注入されるコンストラクタがあるため、実際には何も作成したくありません。
私がしたいことは、AssemblyCatalog
をリポジトリとして使用することです。特定のエクスポートを照会し、コンストラクターの依存関係を渡した後、のみをこのプロセスに関与する部分を構成します。私が理解から
、私は[ImportingConstructor]
のための輸出を設けることなく、...
_container.ComposeParts(this);
をコールした場合、その部品はどれも_container
に含まれないであろう。
コンテナにクエリを容易にするために、以下のように、私は方法があります:
public Lazy<IEntity> GetPart(Func<Lazy<IEntity, IEntityMetaData>, bool> selector) {
var entity = _container.GetExports<IEntity, IEntityMetaData>()
.Where(selector)
.Select(e => e as Lazy<IEntity>)
.FirstOrDefault();
return entity; // this will be passed up to the composition service
}
依存関係を満足させる部分が含まれていない場合GetExports<T, M>()
は[ImportingConstructor]
を含むエクスポートを返さないようです容器内にある。
私のアプローチは、拡張コンテナ/カタログを低レベルにすることです。より高いレベルの構成サービスはすべての部品を受け取り、最終的な対象を構成する。私はこのアプローチを決めて、今後利用できるカタログのタイプを追加/拡張できるようにしました。
はい、彼らが分離されている - 多分よりよい用語は独立していることでしょう。私たちは、構成サービスの拡張となるカタログを持っています。エンティティのサービスを照会すると、完全に構成されたエンティティが返されます。 – IAbstract
私はMEFのConventionモデルを探求するつもりだと思います。私は、部品の発見方法をより柔軟にすると思います。 – IAbstract
実際には、私はちょうどあなたのブログを見つけました:http://mindinthewater.blogspot.com/2011/03/mef-attribute-less-registration.html – IAbstract