Инъекция зависимости и единичное разрешение в Prism - PullRequest
0 голосов
/ 08 февраля 2012

Насколько я понимаю, для одного вызова разрешения все сущности должны быть "связаны друг с другом" через свои зависимости.При разрешении корневого объекта контейнер DI будет рекурсивно создавать остальное.В примерах, которые я видел для Prism, окно Shell не имеет явных зависимостей, поэтому, когда оно разрешается в CreateShell загрузчика, все на этом останавливается.Из-за этого модули должны быть явно разрешены в методе InitializeModules.

Аналогично, вставка представлений в оболочку обычно выполняется путем разрешения их в методе Initialize модуля и явной установки их в заданную область, таким образом используя DI.Контейнер больше как сервисный локатор.

Кто-нибудь знает, как связать вещи вместе, чтобы сделать возможным одно разрешение в Prism?

1 Ответ

0 голосов
/ 14 февраля 2012

Существует приложение, которое имеет два модуля Module1 и Module2.

Вы говорите следующее

public ShellView(IUnityContainer container, IRegionManager regionManager, IEventAggregator eventAggregator, IModule1 mod1, IModuel2 mod2)
{
}

лучше, чем этот

public ShellView(IUnityContainer container, IRegionManager regionManager, IEventAggregator eventAggregator)
{
}

public class IModule1 : IModule
{
  public void Initialize()
  {
     var container = ServiceLocator.Current.GetInstance<IUnityContainer>();
     var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
     regionManager.RegisterViewWithRegion("Region1", typeof(Module1View));   

  }
}

public class IModule2 : IModule
{
  public void Initialize()
  {
     var container = ServiceLocator.Current.GetInstance<IUnityContainer>();
    var regionManager = ServiceLocator.Current.GetInstance<IRegionManager>();
     regionManager.RegisterViewWithRegion("Region2", typeof(Module2View));   

  }
}

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

Модульность

Второй подход более слабосвязан, чем первый. Первый подход заставляет приложение объявлять модули, которые оно собирается использовать.

Я могу решить, что мое приложение будет определять только регионы, и позже я создам модули и добавлю представления в соответствующие регионы.

Я не говорю, что это абсолютно так, поскольку вы можете очень хорошо выбрать первый подход, сказав, что у самих модулей не будет никакой ссылки на то, где он будет использоваться, этот подход является более модульным. Все, что я говорю, это то, что есть варианты того, как решить проблему, и ограничение вариантов, как правило, не очень хорошая идея.

...