Внедрение в конструктор в приложении, где зависимости не могут быть инициализированы - PullRequest
1 голос
/ 12 августа 2010

Мое приложение может запускаться без подключения к базе данных, как мне справиться с этим с помощью IoC и внедрения в конструктор?

Пример:

public class ApplicationShellPresenter(IRepository repository, IView view)
{

}

Когда IRepository в этом случае будет построен, будет сгенерировано исключение из-за того, что DAL не может найти конфигурацию / файл, неверное имя пользователя / пароль и т. Д. И т. Д.

Имея это в виду, я пришел к выводу, что я не могу внедрить репозиторий в конструктор ИЛИ внедрить что-нибудь, что в конечном итоге вдоль линии имеет IRepository как зависимость.

Мне нужно начать без зависимости IRepository и, когда пользователь выполнил правильные настройки базы данных, зарегистрировать IRepository в контейнере. Но тогда я уже оставил корень композиции.

Изменить:

Моя проблема заключалась не в инжекции IoC / Constructor, а скорее в недостатке нашего нижележащего DAL.

Наш DAL конструирует себя при создании. И именно поэтому этот дизайн не сработал, потому что я не мог построить зависимость IRepository без создания нашего DAL-движка.

Моим простым решением было обернуть наш DAL, чтобы он не создавался при создании.

Ответы [ 2 ]

1 голос
/ 13 августа 2010
1 голос
/ 12 августа 2010

Пройди этот этап дальше.Если я правильно вас понимаю, у нас есть:

Application Starts

User specifies some database settings

Repository initialises, passwords etc are checked

Application now uses repository

Моя непосредственная мысль, хммм, интересно, можем ли мы также получить

User decides "I don't like that repository"

User specified new database settings

New repository is initialised

Application closes previous repository, and starts working with new one.

Теперь может оказаться, что это немного более гибко, чемвы запланировали, но это приводит меня к выводу, что у вас фактически есть два приложения с временными отношениями между ними.Есть «оболочка», которая не зависит от хранилища, это та часть, которая запускается без хранилища.Тогда есть дополнительный кусок, который работает только тогда, когда у него есть репозиторий, и я думаю, что он кажется подключаемым, по крайней мере, в концепции.

Следовательно, я не думаю, что ваша оболочка так сильно "впрыскивается", какреагирование на интересные события, такие как:

Here is a repository, if you already have one please close it

Shut down, please close down your repository, and then yourself.

Если у вас есть интерфейс событий, я думаю, вы получите то, что вам нужно.Появление События фактически является Инъекцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...