Я считаю, что объединение Controls
и IoC
- это боль в ... по крайней мере, в коде.Возможно, кто-то поспорит, но ИМО, лучшая практика, чтобы избежать этой боли, - MVVM
.У вас будут viewModels, которые вы можете свободно создавать, используя Unity
, и вводить в них все, что вам нужно.У вас будут представления с привязками к viewModels без какой-либо причины, чтобы знать что-либо изобилующее инверсией управления.
ОБНОВЛЕНИЕ : Основано на комментарии:
App.xaml.cs:
private void HandleStartup(object sender, StartupEventArgs e)
{
var container = CreateContainer(); // create IoC container
var mainViewModel = container.Resolve<MainViewModel>();
var shell = new Shell { DataContext = mainViewModel }; // main View
MainWindow = shell;
shell.Show();
}
Пример оболочки XAML:
<UserControl>
<StackPanel>
<ContentPresenter Content="{Binding ViewModel1}" />
<ContentPresenter Content="{Binding ViewModel2}" />
<ContentPresenter Content="{Binding ViewModel3}" />
</StackPanel>
</UserControl>
MainViewModel:
public class MainViewModel
{
public ViewModel1 ViewModel1 { get; private set; }
public ViewModel2 ViewModel2 { get; private set; }
public ViewModel3 ViewModel3 { get; private set; }
// this will be handled by IoC container
public MainViewModel(ViewModel1 viewModel1, ViewModel2 viewModel2, ViewModel3 viewModel3)
{
ViewModel1 = viewModel1;
ViewModel2 = viewModel2;
ViewModel3 = viewModel3;
}
Таким образом ваши представления не будут знать о IoC, и все, что вы хотите в viewModels, будетуспешно введен.
UPDATE2 DataTemplating, который объединяет Views
и ViewModels
вместе:
App.xaml
<Application.Resources>
<DataTemplate DataType="{x:Type local:ViewModel1}">
<View1 />
</DataTemplate>
</Application.Resources>