Вам нужно немного изменить свой код. Для начала я думаю, что лучше всего отделить вашу реализацию IFactory
(и переименовать ее во что-нибудь менее общее), например ::
public interface IViewModelFactory
{
ILogOnViewModel CreateLogOnViewModel(IShellViewModel shellViewModel);
}
(я опустил часть вашего кода). Затем убедитесь, что вы Export
ваш ConcreteFactory
(и снова, переименуйте). Мы заставляем фабричный метод взять экземпляр вашего IShellViewModel
контракта.
[Export(typeof(IViewModelFactory))]
public class DefaultViewModelFactory : IViewModelFactory
{
public ILogOnViewModel CreateLogOnViewModel(IShellViewModel shellViewModel)
{
return new LogOnViewModel(shellViewModel);
}
}
И настройте LogOnViewModel
так, чтобы в этом случае IShellViewModel
передавался с завода.
public class LogOnViewModel : ILogOnViewModel
{
private readonly IShellViewModel _shellViewModel;
public LogOnViewModel(IShellViewModel shellViewModel)
{
_shellViewModel = shellViewModel;
}
public void SomeOperation()
{
// Do work with _shellViewModel;
}
}
Далее, мы изменим ShellViewModel
, чтобы он был построен, и зависимость была введена для фабрики, которую он будет использовать:
[Export(typeof(IShellViewModel))]
public class ShellViewModel : Conductor<IScreen>, IShellViewModel
{
private readonly IViewModelFactory _factory;
[ImportingConstructor]
public ShellViewModel(IViewModelFactory factory)
{
_factory = factory;
}
public void ShowLogOnView()
{
var model = _factory.CreateLogOnViewModel(this);
ActivateItem(model);
}
}
ImportingConstructor
предписывает MEF использовать этот конструктор и вводить соответствующие типы.
Надеюсь, это указывает на правильное направление?