инверсия зависимостей в высшем классе (основной) - PullRequest
2 голосов
/ 12 апреля 2011

Я хочу создать приложение, в котором у меня есть эти два класса, MainApp и Model (на самом деле больше, но это основа и суть проблемы). MainApp также является начальным классом. Я хочу применить инверсию зависимостей, чтобы mainApp не приходилось перестраивать каждый раз при изменении модели (ну, главным образом потому, что это хорошая практика). Я не могу сделать это:

MainApp - - - > IModel
                  ^
                  |
                  |
                Model

потому что в любом случае мне пришлось бы создавать Model в MainApp, потому что это начало моего приложения, это было бы излишним.

Я думал о переносе содержимого MainApp в другой класс и использовании MainApp как фабрика для MainAppContents и Model, например:

MainApp -------------> Model
   |                     |
   |                     |
   v                     v   
MainAppContents - - - > IModel

Это правильный подход и означает ли это, что любой запуск хорошо разработанного приложения - это фабрика?

Ответы [ 3 ]

3 голосов
/ 12 апреля 2011

Звучит так, будто вы запрашиваете способ включения позднего связывания . Программирование интерфейса - это первый шаг, и вы уже это делаете.

Следующим шагом является сопоставление интерфейса с конкретным классом . Самый простой способ сделать это с DI-контейнером . Ваш метод Main теперь может выглядеть так:

static void Main()
{
    var container = CreateContainer();
    IModel model = container.Resolve<IModel>();
    // use model...
}

Я специально пропустил реализацию вспомогательного метода CreateContainer, поскольку выбор контейнера DI - это другой вопрос .

Все основные DI-контейнеры для .NET поддерживают позднюю привязку, поэтому это позволит вам реализовать IModel в другой сборке. Интерфейс IModel должен оставаться у потребителя (Main).

1 голос
/ 12 апреля 2011

Я не совсем уверен, в чем проблема, но если MainApp необходимо создать экземпляры Model, то вам следует использовать абстрактный шаблон фабрики, например IModelFactory, у которого есть метод, который возвращаетновый IModel.

Если вы собираетесь использовать контейнер IoC, то вам нужно разрешить IModel через контейнер.Вместо того, чтобы IModelFactory зависел от вашего контейнера, вы можете использовать функции вашего контейнера IoC, чтобы создать для вас конкретную реализацию IModelFactory, и неявно использовать контейнер для разрешения IModel.

Редактировать

Я бы также сказал, получить книгу Марка !Это здорово!

0 голосов
/ 12 апреля 2011

Если вы хотите добиться слабой связи, вам следует подумать об использовании контейнера для ввода зависимостей (например, Unity или MEF ).

...