Обходной путь к Запросу Призмы? - PullRequest
3 голосов
/ 16 мая 2011

Я использую призму навигация на основе вида с методом RequestNavigate.

Проблема, с которой я сталкиваюсь, заключается в том, что я должен зарегистрировать все ViewModels в контейнере:

container.RegisterType<object, InboxView>("InboxView");

Это очень многословно и требует список всех типов представлений, которые я хочу зарегистрировать.
Есть ли обходной путь для этого?

Я думаю, что RequestNavigate должен был быть универсальным:

IRegion.RequestNavigate<TView>();

И должен выполнить следующее:

  1. Разрешить вид
  2. Дайте виду название в регионе, которое должно быть typeof(TView).Name
  3. Выполнить актуальный запрос навигации:)
  4. Пожалуйста, проголосуйте за мое предложение Дайджест в списке вопросов Prism.

1 Ответ

0 голосов
/ 23 мая 2011

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

  1. Запросы региона не зависят от типа. Если у вас нет ссылки на тип в модуле A из модуля B, но вы хотите перейти туда, как вы можете перемещаться без ссылок на эти модули друг с другом или без рефакторинга этих типов в 3-ю сборку?
  2. В регионах может быть столько видов определенного типа, сколько необходимо. Предлагаемое вами решение будет искусственно ограничивать количество просмотров определенного типа до одного, что в настоящее время не соответствует принципам работы регионов.

Однако это не отвечает на ваш вопрос.

Что касается сокращения многословия, вы ничего не можете сделать, кроме как развернуть свое собственное решение, которое инкапсулирует поведение, которое вы хотите, перед RegionManager. Лично я бы не пошел по этому пути, но это, безусловно, то, что вы можете сделать. Вы можете написать это как свой собственный сервис или просто метод расширения в IRegionManager или IRegion.

public interface IMyNavigationService
{
     //Your own implementation could use (typeof(T)).Name (or 
     //AttributedModelServices.GetContractName(typeof(T)) if using MEF)
     //as the Key, if thatis appropriate for your solution 
     //(1 instance T per region and references to T from all Modules)
     void RequestNavigation<T>();
}

Похоже, что переключение на MEF, поскольку контейнер IoC может помочь вам ... это зависит только от того, какая из этих строк кода вам не нужна. Мне не нравится RegisterType<object, InboxView>. Эквивалент MEF будет:

[Export]
public class InboxView { .. }

Здесь вы можете указать название контракта ([Export("InboxView")]), но по умолчанию будет указано название контракта AttributedModelServices.GetContractName(typeof(InboxView)). Пока все, что вы выбираете, согласуется с тем, как вы решили генерировать имя в реализации IMyNavigationService, оно должно работать нормально.

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

public static class RegionExtensions
{
    public static void RequestNavigate<T>(this IRegion region)
    {
        region.RequestNavigate(AttributedModelServices.GetContractName(typeof(T)));
    }
}

Если вы нервничаете по поводу переключения всего на MEF, есть проект MefContrib , который делает это намного проще ... он в основном объединяет Unity и MEF в одном.

Надеюсь, это поможет.

...