Iは、(簡単にするために除去非関連コード)以下のような単純なコンソールアプリケーションを有するMEFおよびAssemblyCatalog/AggregateCatalog
[ImportMany(typeof(ILogger))]
public IEnumerable<ILogger> _loggers {get;set;}
public interface ILogger
{
void Write(string message);
}
[Export(typeof(ILogger))]
public class ConsoleLogger : ILogger
{
public void Write(string message)
{
Console.WriteLine(message);
}
}
[Export(typeof(ILogger))]
public class DebugLogger : ILogger
{
public void Write(string message)
{
Debug.Print(message);
}
}
カタログを初期化コードが
(1) var catalog = new AggregateCatalog();
(2) catalog.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory));
(3) //var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
var batch = new CompositionBatch();
batch.AddPart(this);
container.Compose(batch);
未満であるカタログ場合ログラインには何もロードされていません カタログがトラフライン3に初期化されていれば、両方のロガーが_loggerにロードされました
What ' AggregateCatalogアプローチの問題?
おかげ
ありがとう。しかし、DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)という行が、appのbinフォルダ内のすべてのDLLからのカタログエクスポートに追加されることを期待しています(これは実際にある時点で必要なものです)。 AssemblyCatalogとは異なり、AssemblyCatalogは現在のアセンブリからのエクスポートを追加するだけです。どのようにすべてのDLLの輸出を探すには? – bzamfir