Как создать экземпляры моих классов в Prism4 MEF? - PullRequest
2 голосов
/ 01 марта 2011

Я настроил контейнер:

public class MyBootstrapper : MefBootstrapper  
{  
    protected override void ConfigureAggregateCatalog()
    {
        AggregateCatalog.Catalogs.Add(xxx.Assembly));
// other assemblies
    }

    protected override void InitializeShell()
    {
        base.InitializeShell();
        Application.Current.MainWindow = (MainWindow)Shell;
        Application.Current.MainWindow.Show();
    }

    protected override DependencyObject CreateShell()
    {
        return Container.GetExportedValue<MainWindow>();
    }
}

Как я могу создать экземпляр моего типа T в модуле?Тип T определен где-то в сборках, которые настроены MEF.

Мне нужно что-то вроде этого:

var myType = XXXX.Resolve<T>();

UPD1.MyModule

[ModuleExport(typeof(CatalogModule))]
public class CatalogModule : IModule
{
    private readonly IEventAggregator _event;
    private readonly IUIManager _uiManager;

    [ImportingConstructor]
    public CatalogModule(IEventAggregator @event, IUIManager uiManager)
    {
        _event = @event;
        _uiManager = uiManager;
    }

    private void Foo()
    {
        var vm = **How create instance of desired type here?**
    }
}

1 Ответ

3 голосов
/ 01 марта 2011

Вы делаете это так же, как вы получили экземпляр MainWindow в переопределении метода CreateShell.Все, что вам нужно сделать, это позвонить по номеру Container.GetExportedValue<T>(), что позволит вам получить экземпляр напрямую.Однако, если вы хотите, чтобы тип был внедрен, для более слабой связи необходимо иметь конструктор с атрибутом и [ImportingConstructor], который зависит от этого типа (или, предпочтительно, с интерфейсом), или свойство этого типа с[Import] attribute.

Убедитесь, что ваш тип экспортирован, для этого нужно указать класс с атрибутом [Export] и добавить сборку в AggregateCatalog.

Hopeэто помогает;)

...