C# MEF を使用する現在確立されているアセンブリを拡張しようとしています。これらのアセンブリは既に運用環境で使用されているため、個々のクラスを直接変更することは、現時点では実行可能な方法ではありません。主に、既存の動作に新しい動作を追加しています。たとえば、私は持っています:
public IExtension
{
Object Execute();
}
public BaseExtension : IExtension
{
// other methods and members
public virtual Object Execute()
{
// do operations here.
}
}
[Export(typeof(IExtension)]
public AppRecordExtension : BaseExtension
{
// .. other methods and members
public override Object Execute()
{
base.Execute(); // shown just for example..
this.someOperation();
}
}
// other extensions made.
上記は、MEF コンテナーがドライバーのメソッドで拡張機能を呼び出すときに機能します。
[ImportMany(typeof(IExtension)]
private IEnumerable<Lazy<IExtension>> operations;
public void ExecuteExtensions()
{
var catalog = new AggregateCatalog( new AssemblyCatalog(Assembly.GetExecutingAssembly()), new DirectoryCatalog("extensions", ".dll"));
CompositionContainer container = new CompositionContainer(catalog);
container.ComposeParts(this);
Dictionary<IExtension, object> result = new Dictionary<IExtension, object>();
foreach(Lazy(IExtension> extension in operations)
{
result.Add((extension.Value, extension.Value.Execute());
}
}
ただし、IExtension または BaseExtension に特定のデコレータを実装したい場合、それらをコンテナのどこに配置すればよいか、またはデコレータに属性を配置して元の IExtension 具象クラスがすべてロードされ、追加の動作で実行されます。IExtension デコレーターの例:
// do I put an attribute here?
// if an attribute is put here, how does the MEF container call it?
public BatchableExtension : BaseExtension
{
private IExtension extension = null;
public BatchableExtension( IExtension extension)
{
this.extension = extension;
}
public override Object Execute()
{
this.extension.Execute();
doSomeBatchSpecificOperation();
}
}
// do I put an attribute here?
// if an attribute is put here, how does the MEF container call it?
public MonitoringExtension : BaseExtension
{
private IExtension extension = null;
public MonitoringExtension( IExtension extension)
{
this.extension = extension;
}
public override Object Execute()
{
this.extension.Execute();
doSomeMonitoringSpecificOperation();
doSomeMoreBehaviors();
}
誰かがここで助けてくれますか? コンテナーが拡張機能を取得するときに、渡されたパラメーターに応じて新しい動作も取得されるようにしたいと考えています (たとえば、isBatchable = true の場合、BatchableExtension を追加するなど)。非 MEF の場合、上記は次のようになります。
public void Main(String[] args)
{
IExtension ext = new AppRecordExtension();
// this is the part where I want to simulate when I use MEF.
IExtension ext2 = new MonitoringExtension(new BatchableExtension(ext));
ext2.Execute();
}