2015-02-23 1 views
2

Как я могу обрабатывать несколько модулей, которые используют одно и то же имя вида?Несколько модулей призмы с таким же именем вида

Для справки, я использую Ninject, но это должно быть то же самое с Unity

Если у меня есть 2 модуля, ModuleA и ModuleB, и оба модуля имеют вид называется ViewX, как это будет работать? Я думал, что для навигации по модулю я могу сделать RegionManager.RequestNavigation("MainRegion", "ViewX"), и призма будет переходить к тому, какой модуль содержит этот вид. Поскольку есть 2, он захватит первый, но контейнер IoC взорвется, потому что есть 2 регистраций для object, которые называются ViewX.

Я мог бы легко сделать регистрацию, как ModuleA,ViewX, ModuleB,ViewX, но разве это не полностью победит цель?

Что такое хороший способ справиться с этим?

+0

Wow, 2 down голосов за пару минут. Если бы вы объяснили, почему, возможно, я мог бы просто удалить этот вопрос. –

+0

Я не знаю, откуда берутся нисходящие спуски; для меня это хороший вопрос. – dymanoid

+0

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

ответ

2

Существует несколько способов решения проблемы.

Первый, который вы уже описали в своем вопросе: просто зарегистрируйте свои объекты вида с помощью «полных квалифицированных» ключей, содержащих ваши имена модулей. Обратите внимание, что метод расширения RequestNavigate(this IRegionManager regionManager, string regionName, string source) принимает строку URI как аргумент source, так что это не нарушит парадигму: вы предоставляете полный URI своего представления.

Другая возможность заключается в предоставлении пользовательской реализации интерфейса IServiceLocator. Вы можете зарегистрировать его в контейнере IoC в своем загрузочном блоке. Призма создает новое представление, запрашивающее экземпляр с текущего IServiceLocator: newRegionItem = this.serviceLocator.GetInstance<object>(candidateTargetContract). Например, IServiceLocator реализации для MEF генерирует исключение, если несколько экспорта соответствует запрашиваемому контракта:

IEnumerable<Lazy<object, object>> exports = this.compositionContainer.GetExports(serviceType, null, key); 
if ((exports != null) && (exports.Count() > 0)) 
{ 
    // If there is more than one value, this will throw an InvalidOperationException, 
    // which will be wrapped by the base class as an ActivationException. 
    return exports.Single().Value; 
} 

Вы можете изменить это поведение, что вам нравится, например return exports.First().Value.