2

なぜ次のことが起こるのか興味があります。

インポートされたアセンブリで 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
    }
}

誰かが私にその行動の理由を説明できますか?

4

1 に答える 1