Как я могу свободно ссылаться на модули в Prism, чтобы они могли или не могли существовать? - PullRequest
2 голосов
/ 20 июля 2009

В этот вопрос о переполнении стека Я узнал, что Призма / Единство не так отделены, как я думал , например. если у меня есть этот класс, который получает menuManager, вставленный в его конструктор, то я должен убедиться, , что этот класс существует где-то (я думал, что вы можете просто извлечь DLL, содержащую класс и контейнер будут иметь с ним дело, например, введя на его месте нуль):

public class EmployeesPresenter
{
    public EmployeesPresenter(IMenuManager menuManager)
    {

    }
}

Но я могу справиться с этим: приложение не может работать без MenuModule (или, как было предложено, у меня может быть NullMenuModule , который ничего не делает, но удерживает приложение от взлома).

Однако приложение, которое я создаю, будет иметь класс MenuManager в MenuModule, и каждый модуль должен будет регистрировать все, что он хочет иметь в меню, с помощью MenuManager. Тем не менее, я хочу иметь возможность поменять MenuModules например. иметь модуль InfragisticsMenuMou и иметь модуль TelerikMenu и т. д.

Однако, когда я нахожусь в, например, модуль Customers, для того чтобы использовать TelerikMenuModule, мне нужно сослаться на него . И когда я хочу использовать InfragisticsMenuModule, мне нужно сослаться на это.

Так как я смогу "горячо заменить" TelerikMenuModule с InfragisticsMenuModule без перекомпиляции всех моих модулей с новыми ссылками , например, Я хочу заменить это:

Application.exe
Customers.dll
TelerikMenuModule.dll

с этим:

Application.exe
Customers.dll
InfragisticsMenuModule.dll

и просто сможете перезапустить приложение, и оно запускается с новым InfragisticsMenuModule.dll, а не жалуется, что TelerikMenuModule.dll больше не существует .

Ответы [ 2 ]

5 голосов
/ 20 июля 2009

Здесь вступают интерфейсы. Вам нужно что-то вроде:

public interface IMenuSystem
{
    // whatever operations need to be offered by a menu system
}

Application.exe и Customers.dll могут относиться только к этому интерфейсу. Они не позволяют знать о конкретной реализации.

Тогда вы будете использовать шаги конфигурации (вызов методов Register... или использование файла конфигурации), чтобы указать, какой тип будет обеспечивать реализацию MenuSystem.

2 голосов
/ 20 июля 2009

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

Также предлагается поместить этот IMenuModule в общую сборку (отдельно от вашей другой сборки). Я обычно называю эту вещь Something.Core.dll.

Таким образом, у вас могут быть: Application.exe, Customer.dll, Application.Core.dll и ваша конкретная реализация MenuModule.

Ваша конкретная реализация MenuModule будет ссылаться на сборку Application.Core, чтобы получить доступ к интерфейсу IMenuModule и реализовать ее там.

...