Creating the View and View Model Using Unity
Using Unity as your dependency injection container is similar to using MEF, and both property-based and constructor-based injection are supported. The principal difference is that the types are typically not implicitly discovered at run time; instead, they have to be registered with the container.
Typically, you define an interface on the view model so the view model's specific concrete type can be decoupled from the view. For example, the view can define its dependency on the view model via a constructor argument, as shown here. C#
public QuestionnaireView() { InitializeComponent(); } public QuestionnaireView(QuestionnaireViewModel viewModel) : this() { this.DataContext = viewModel; }
The default parameter-less constructor is necessary to allow the view to work in design-time tools, such as Visual Studio and Expression Blend.
Alternatively, you can define a write-only view model property on the view, as shown here. Unity will instantiate the required view model and call the property setter after the view is instantiated. C#
public QuestionnaireView() { InitializeComponent(); } [Dependency] public QuestionnaireViewModel ViewModel { set { this.DataContext = value; } }
The view model type is registered with the Unity container, as shown here. C#
IUnityContainer container; container.RegisterType<QuestionnaireViewModel>();
The view can then be instantiated through the container, as shown here. C#
IUnityContainer container; var view = container.Resolve<QuestionnaireView>();
If I leave out the last part of the code regarding registering the ViewModel and instantiating the View, and just use either of the two methods of hooking the ViewModel to the View here (using a constructor or using a property) it seems the ViewModel and View it seems everything is working fine. So what is the need for the code registering the ViewModel and instantiating the View?
The first example, hooking the View and ViewModel using a constructor, has no mention of Unity of all, so is Unity actually being used here?
Are there any advantages of using property-based injection over construtor based injection or are they exactly the same thing?
The first part of the text says "*Typically, you define an interface on the view model so the view model's specific concrete type can be decoupled from the view", and then gives an example. Yet this example makes no mention of interfaces at all. What is going on here, am I missing something?