В this stackoverflow question Я узнал, что Призма/Единство не такое развязанное, как я думал, например. если у меня есть этот класс, который получает menuManager, введенный в его конструктор, тогда я должен убедиться, что, что этот класс фактически существует где-то (я думал, что вы можете просто вытащить .dll, содержащую класс, и контейнер будет иметь дело с это, например, впрыскивание нуля в своем месте):Как я могу свободно ссылаться на модули в Призме, чтобы они могли или не могут существовать?
public class EmployeesPresenter
{
public EmployeesPresenter(IMenuManager menuManager)
{
}
}
но я могу с этим справиться: приложение не может работать без MenuModule (или же, как это было предложено, я мог бы иметь NullMenuModule, которая не делает ничего, но сохраняет приложение от взлома).
Однако приложение, которое я создаю, будет иметь класс MenuManager в MenuModule, и каждый модуль должен будет зарегистрировать все, что он хочет иметь в меню с помощью MenuManager. Тем не менее, я хочу, чтобы можно было заменить меню Menu 0 модели, например. есть InfragisticsMenuModule и имеют TelerikMenuModule и т.д.
Однако, когда я нахожусь в, например, CustomerModule, чтобы использовать TelerikMenuModule, Мне нужно ссылаться на него. И когда я хочу использовать InfragisticsMenuModule, мне нужно это сделать.
Итак, как я смогу «горячей замены» TelerikMenuModule с InfragisticsMenuModule без перекомпиляции всех моих модулей с новыми ссылками, например. Я хочу, чтобы заменить это:
Application.exe
Customers.dll
TelerikMenuModule.dll
с этим:
Application.exe
Customers.dll
InfragisticsMenuModule.dll
и просто иметь возможность перезапустить приложение и работает с новым InfragisticsMenuModule.dll и не жалуется, что TelerikMenuModule.dll нет дольше существует.
@Earwicker: но как бы реализовать это, например. как мне «вызвать регистр», я нашел в документации Unity раздел «Как заполнить каталог модулей из файла конфигурации или каталога в WPF», с которым я буду работать. –
Да, это звучит как правильная вещь. –
Это правильная техника. В своей оболочке вы регистрируете объект с вашим контейнером, который реализует IMenuSystem. Модули «Клиент» просто заявляют, что им нужна IMenuSystem, и ваша оболочка будет внедрять реализацию, которая знает об Infragistics или знает о Telerik. Вам нужно только, чтобы каждый модуль ссылался на DLL «Контракты», который просто содержит определения вашего интерфейса. Это 100% правильный ответ. Мы делаем это в нашем собственном проекте, и он отлично работает. –