Использование Unity в WPF - PullRequest
       32

Использование Unity в WPF

3 голосов
/ 01 марта 2011

У меня Unity 2.0 хорошо работает в App.xaml.cs, чтобы зарегистрироваться и разрешить его в этом классе.

У меня вопрос относительно наилучшей практики.

У меня есть номерпользовательских элементов управления и других классов, которые также должны разрешать некоторые из тех же и новых реализаций интерфейса <->.Проблема в том, что нет способа получить доступ к контейнеру Unity, который я создал в App.xaml.cs.

Я не могу использовать конструктор или внедрение свойства для передачи ссылки на контейнер.

  1. Слишком много (это большой проект)
  2. Пользовательские элементы управления добавляются через xaml
  3. В проекте есть несколько очень слабо связанных "модулей", которыеможет совместно использовать одну и ту же конфигурацию контейнера.

Я бы не хотел заново создавать контейнер из файла конфигурации в каждом объекте, которому требуется доступ к контейнеру.

Любые рекомендации, еслиодин и тот же контейнер нужен в качестве службы в различных «модулях» одной и той же сборки?

Спасибо.

1 Ответ

4 голосов
/ 01 марта 2011

Я считаю, что объединение 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>
...