Я вижу, к чему вы стремитесь, но предлагаемое решение не соответствует целям разработки RegionManager. В частности:
- Запросы региона не зависят от типа. Если у вас нет ссылки на тип в модуле A из модуля B, но вы хотите перейти туда, как вы можете перемещаться без ссылок на эти модули друг с другом или без рефакторинга этих типов в 3-ю сборку?
- В регионах может быть столько видов определенного типа, сколько необходимо. Предлагаемое вами решение будет искусственно ограничивать количество просмотров определенного типа до одного, что в настоящее время не соответствует принципам работы регионов.
Однако это не отвечает на ваш вопрос.
Что касается сокращения многословия, вы ничего не можете сделать, кроме как развернуть свое собственное решение, которое инкапсулирует поведение, которое вы хотите, перед 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 в одном.
Надеюсь, это поможет.