MEF - Любой способ инициализировать его с параметрами? - PullRequest
1 голос
/ 19 июня 2011
[Export]
public class MyViewModel : NotificationObject
{
    public MyViewModel(Foo foo)
    {
        DoWorkCommand = new DelegateCommand(DoWork);

        MyFoo = foo;
    }

    [Import]
    private IBarService MyBarService { get; set; }

    public Foo MyFoo { get; private set; }

    public DelegateCommand DoWorkCommand { get; set; }

    public void DoWork()
    {
        MyBarService.DoSomething(MyFoo);
    }
}

Как я могу получить экземпляр класса MyViewModel, также имея возможность передавать параметры? Я подумал, что, возможно, ExportFactor<T> позволит мне передать некоторые параметры, но это не так. Итак, есть ли какая-то модель, которая отвечает за то, чего я надеюсь достичь?

Простое выполнение new () не обрезает его, потому что MyBarService остается нулевым. Я думал об удалении ExportAttribute и использовании ComponentInitializer.SatisfyImports(this), что позволяет мне использовать new (), но это делает меня таким образом, чтобы я использовал new () все. Я как бы надеялся на лучшее из обоих миров ... имея какой-то способ импортировать что-то с параметрами. Таким образом, я все еще не связан, но могу генерировать экземпляры моей ViewModel с установленными параметрами.

Ответы [ 2 ]

0 голосов
/ 19 июня 2011

Если вы хотите передать некоторые параметры из импортера в экспортер, то вы можете поместить метод Initialize в экспортируемый класс или интерфейс. Примерно так:

[Export]
public class MyViewModel : NotificationObject
{
    public MyViewModel()
    {
        DoWorkCommand = new DelegateCommand(DoWork);
    }

    public void Initialize(Foo foo)
    {
        MyFoo = foo;
    }

    [Import]
    private IBarService MyBarService { get; set; }

    public Foo MyFoo { get; private set; }

    public DelegateCommand DoWorkCommand { get; set; }

    public void DoWork()
    {
        MyBarService.DoSomething(MyFoo);
    }
}

Затем используйте ExportFactory на стороне импорта и вызовите метод Initialize после создания нового экземпляра экспорта.

0 голосов
/ 19 июня 2011

MEF поддерживает внедрение зависимостей, например, я мог бы сделать:

[ImportingConstructor]
public MyViewModel(Foo foo)
{

}

И MEF автоматически попытается внедрить экземпляр Foo в мой конструктор.Возможно, вы могли бы использовать этот механизм для внедрения необходимых вам услуг в ваши составные части?

...