Проблема с этим кодом заключается в том, что в варианте 2 выпекается больше, чем нужно. Это действительно не нужно и не должно иметь ссылку на контейнер.
Альтернатива позволяет варианту 2 быть таким же тестируемым, как и вариант 1, но концептуально понятнее, поскольку ViewModel никогда не знает о View.
Это особенно полезно, если вы хотите указать макет с помощью файла XML, а не с помощью областей призмы, что позволяет легко настроить макет.
Альтернатива:
public interface IView
{
}
public interface IViewModel
{
}
public class View : IView
{
private IViewModel model;
public View(IViewModel m)
{
this.model = m;
this.DataContext = this.model;
}
}
public class ViewModel : IViewModel
{
}
и где-то еще у вас есть:
Container.RegisterType<IViewModel, ViewModel>( /* appropriate container config */ );
Container.RegisterType<IView, View>(/* appropriate container config */ );
и вы можете создать представление в любом месте с помощью:
Container.Resolve<IViewModel>();