Платформа навигации Silverlight с контейнером Unity - PullRequest
3 голосов
/ 11 ноября 2011

Я использую Silverlight Navigation Framework и недавно кодировал свое приложение следующим образом:

Public MasterPageView: UserControl
{
    private IMasterPageViewModel _ViewModel = null;

    public MasterPageView():this(new MasterPageViewModel(), new BusinessObjectProvider())
    {
    }

    public MasterPage(IMasterPageViewModel viewModel)
    {
        InitializeComponent();

        _ViewModel = viewModel;
        this.DataContext = viewModel;
    }
}

Теперь, когда у меня создан скелет моего проекта, я хочу выполнить некоторыеприведение в порядок, прежде чем начнется тяжелое развитие.В рамках моего процесса рефакторинга я хочу использовать Unity IOC и удалить мои конструкторы по умолчанию.

Кто-нибудь использовал Silverlight Navigation Framework с Unity?Буду признателен за любые предложения о том, как это сделать.

Основные проблемы и вопросы, которые я вижу: 1) Где я могу зарегистрировать объекты в Unity Framework?2) Все виды создаются с использованием URIMAPPER в Silverlight Navigation Framework. Как заставить URIMAPPER использовать Unity для создания своих представлений.

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

1 голос
/ 12 ноября 2011
0 голосов
/ 11 ноября 2011

Когда люди создают представления, передавая их через контейнер IOC, я всегда чувствую себя грязно. Ваши поверхности дизайна (Visual Studio и Expression Blend) не будут этого делать - они настаивают на использовании конструктора по умолчанию. Так зачем бороться с ними?

Гораздо более чистым решением является использование шаблона локатора модели вида. Вот основной:

public abstract class ViewModelLocator<TViewModel>
{
  public TViewModel ViewModel
  {
    get { return StaticGateway.ServiceLocator.GetInstance<TRuntimeViewModel>(); }
  }
}

Где StaticGateway - это статический класс, который предоставляет доступ к вашему контейнеру Unity и предоставляет его ServiceLocator. Тогда вы просто объявляете одно:

public class MasterPageViewModelLocator : ViewModelLocator<IMasterPageViewModel> { }

И используйте его в XAML:

<UserControl x:Class="YourCompany.MasterPageView"  etc.>

  <UserControl.Resources>
    <local:MasterPageViewModelLocator x:Key="Locator" />
  </UserControl.Resources>

  <UserControl.DataContext>
    <Binding Source="{StaticResource Locator}" Path="ViewModel" />
  </UserControl.DataContext>

  ...etc...
</UserControl>

Ваши привязки, как правило, будут намного счастливее, потому что вы устанавливаете контекст данных в своем XAML. Установка контекста данных в коде позади может привести к некоторым странным поведениям, особенно когда вы переходите к интересным представлениям, таким как присоединенное поведение. И вы по-прежнему полностью используете свой контейнер IOC для выполнения внедрения зависимостей с дополнительным преимуществом всех ваших поверхностей проектирования, которые продолжают функционировать.

Что касается того, где зарегистрироваться, я не уверен, куда именно вы поместите это в приложение для навигации. Обычно вы используете Unity с чем-то вроде Prism и выполняете регистрацию в модуле инициализаторов. Я полагаю, вы могли бы сделать это в своем классе App или придумать эквивалент инициализатора модуля (но тогда вы должны просто использовать Prism, а не изобретать велосипед).

0 голосов
/ 11 ноября 2011

Мы используем Prism Regions в XAML каждой страницы. Регионы будут автоматически выполнять IOC, когда он создает представление, зарегистрированное для него. Таким образом, страницы не создаются с помощью Unity, а регионы, которые они содержат, делают.

Весь код на страницах - это передача любых параметров Url регионам. Это несколько уродливая вещь, которую делают страницы; они вставляют пармы строки запроса в параметр RegionContext региона. В этом случае представление области содержит некоторый код для получения этих данных контекста и передачи их в свою виртуальную машину, предоставленную Unity.

Если вы не используете Prism, это не сильно поможет. РЕДАКТИРОВАТЬ: было еще несколько деталей о том, как заставить регионы Prism хорошо работать с навигационными страницами Я поделюсь, если вы хотите пойти по этому пути.

Время от времени мы получаем доступ к контейнеру Unity с помощью созданного нами статического метода (я думаю, что статический метод просто разрешает объекты для вас, он не дает всем интерфейс контейнера). Это отстой, но вы можете решить это вручную.

...