なぜ次のことが起こるのか興味があります。
インポートされたアセンブリで ImportMany を使用し、インポートされたアセンブリのコンストラクターで compose メソッドを呼び出すと、ImportMany IEnumerable が満たされていることがわかりますが、コンストラクターから出て親アセンブリのコードに戻るとすぐに、マウス カーソルを移動します。インポートされたばかりのアセンブリでは、ImportMany IEnumerable が空です!
「親」アセンブリから呼び出すメソッドで構成を行うと、すべてうまくいきます。
以下が機能しないことを意味します: コード例 (親):
private CompositionContainer modules;
private AggregateCatalog catalogOfModules = new AggregateCatalog();
#region MEF Imports
[Import(typeof(IMyTypedInterface<someOtherInterface>),AllowDefault=true)]
public someOtherInterface someObject;
public void StartProgram()
{
try
{
catalogOfModules.Catalogs.Add(new DirectoryCatalog(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + System.IO.Path.DirectorySeparatorChar + "directoryWichContainsMyAssembly"));
modules = new CompositionContainer(catalogOfModules);
modules.ComposeParts(this);
someObject.listOfModules.Count; # is 0
}
catch (CompositionException)
{
}
}
コード例 (子):
[Export(typeof(IMyTypedInterface<someOtherInterface>))]
public class ExampleChild{
[ImportMany(typeof(someInterface))]
private IEnumerable<someInterface> listOfModules;
private CompositionContainer modules;
private AggregateCatalog catalogOfModules = new AggregateCatalog();
public ExampleChild()
{
catalogOfModules.Catalogs.Add(new DirectoryCatalog(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + System.IO.Path.DirectorySeparatorChar + "someDirectoryWithAssemblies"));
modules = new CompositionContainer(catalogOfModules);
modules.ComposeParts(this);
listOfModules.Count; # is 2
}
}
===========================================
しかし、これは機能します
コード例 (親):
private CompositionContainer modules;
private AggregateCatalog catalogOfModules = new AggregateCatalog();
#region MEF Imports
[Import(typeof(IMyTypedInterface<someOtherInterface>),AllowDefault=true)]
public someOtherInterface someObject;
public void StartProgram()
{
try
{
catalogOfModules.Catalogs.Add(new DirectoryCatalog(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + System.IO.Path.DirectorySeparatorChar + "directoryWichContainsMyAssembly"));
modules = new CompositionContainer(catalogOfModules);
modules.ComposeParts(this);
if (someObject != null)
{
someObject.ComposeMethod();
someObject.listOfModules.Count; # is 2
}
}
catch (CompositionException)
{
}
}
コード例 (子):
[Export(typeof(IMyTypedInterface<someOtherInterface>))]
public class ExampleChild : IMyTypedInterface<someOtherInterface>, someOtherInterface{
[ImportMany(typeof(someInterface))]
private IEnumerable<someInterface> listOfModules;
private CompositionContainer modules;
private AggregateCatalog catalogOfModules = new AggregateCatalog();
public void ComposeMethod()
{
catalogOfModules.Catalogs.Add(new DirectoryCatalog(System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + System.IO.Path.DirectorySeparatorChar + "CM"));
modules = new CompositionContainer(catalogOfModules);
modules.ComposeParts(this);
listOfModules.Count; # is 2
}
}
誰かが私にその行動の理由を説明できますか?