2010-08-26 3 views
1

Я пытаюсь выполнить ретро-установку (плохая идея, которую я знаю, но лучше поздно, чем никогда) IOC и DI в существующее решение.IOC через проекты визуальной студии?

База кода состоит из примерно 30 проектов, каждая из которых имеет классы в них, которые мало или вообще не имеют видимости для внешнего мира. Будучи относительно новым для IOC, я стараюсь использовать передовую практику при переработке кода, и лучше не пропускать контейнер IOC или статично, поэтому я пытаюсь сделать все через инъекцию конструктора.

Однако, и здесь возникает мой вопрос: мне нужно сделать много классов общедоступными в разных проектах (например, в файлах физического .csproj). Мне нужно это сделать, потому что мой «модуль конфигурации» (я использую Ninject, но это агностический вопрос IOC) должен знать обо всем в любом классе в любом проекте, чтобы иметь возможность разрешать зависимости.

Я пропустил что-то важное? Все ли мои классы должны быть общедоступными, если они основаны на интерфейсе? Могу ли я каким-то образом создать контейнер МОК для каждой из моих границ csproj и сделать для меня инъекцию?

Ta

ответ

2

Не могли бы вы написать модуль конфигурации внутри каждого проекта и сделать это общедоступным? Затем настройте ninject со всеми модулями вместо одного ...

+2

Плюсы: Инкапсуляция. Минусы: каждый модуль теперь имеет зависимость от Ninject; конфигурация может быть более жесткой (что, если потребитель A хочет, чтобы IFoo был реализован Bar вместо Foo?); ни одного места, чтобы увидеть все сопоставления. – TrueWill

1

Я считаю, что вы на правильном пути. В общем, любой контейнер IoC должен будет знать (а) интерфейс и (б) реализацию, чтобы он мог подключить все. Обычно вы выполняете «проводку» в модулях более высокого уровня (в этом случае проект вашего модуля конфигурации); модули нижнего уровня не должны знать обо всех возможных реализациях интерфейсов. Чтобы это произошло (и чтобы облегчить тестируемость), реализации должны быть общедоступными.

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

Вы также можете посмотреть MEF; очевидно it allows the implementations to be private or internal.

Смежные вопросы