Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MEF Import Composition Issues

Tags:

c#

.net

mef

I've read all the questions I can find regarding the issues of composing imports without exporting the containing class but I can't find a solution to my problem. Does anybody know a way to achieve what I'm trying to do?

My module assemblies have forms and classes which they use internally. These forms need access to some of the exported contracts but imports are not loaded as they are not in the MEF 'composition tree'

Host assembly:

public class Host
{
    public Host()
    { /* Compose parts here... */ }

    [Export(typeof(Licence))]
    public Licence LoadedLicence { get; set; }  

    [Export(typeof(IModule))]
    public List<IModule> LoadedModules { get; set; }
}

Module assembly:

[Export(typeof(IModule))]
public class Module : IModule
{        
    public Module() { }

    public void DoSomething()
    {
        SubForm sub = new SubForm();
        sub.ShowDialog();
    }

    [Import(typeof(Licence))]
    public Licence LoadedLicence { get; set; } // This works here
}

public class SubForm : Form
{        
    public SubForm ()
    { }

    [Import(typeof(Licence))]
    public Licence LoadedLicence { get; set; } // This doesn't work in here
}

As far as I can see, my options are:

  1. Pass parameters to constructors (pain)
  2. Use a dummy export on the classes that need imports satisfying?

Any others?

like image 444
Tim Avatar asked Dec 28 '25 15:12

Tim


1 Answers

I your specific case I would simply Export SubForm as its concrete type and Import in in Module. In that case all of its imports will be satisfied. Although if you expect to call DoSomething more than once then you will run into issues.

Another way people sometimes do this is to manually add the CompositionContainer to itself under the contract ICompositionService in your host and then have your module import ICompositionService and then everytime you create a SubForm you simply pass your object instance into ICompositionService.SatisifyImportsOnce to get its Imports satisfied.

like image 139
Wes Haggard Avatar answered Dec 30 '25 06:12

Wes Haggard



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!