2010-08-12 4 views
1

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

Пример:

public class ApplicationShellPresenter(IRepository repository, IView view) 
{ 

} 

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

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

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

Edit:

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

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

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

ответ

1

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

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. 

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

+0

Спасибо, интересные idéas. – Marcus

1
+0

Ницца, я также придумал фабричный подход, но меня все еще беспокоит одна вещь. В моем приложении у меня много реализаций, требующих IRepository. Как я могу решить это с завода? Нужно ли мне обертывать каждую реализацию, которая нуждается в IRepository, с классом, который вместо этого использует зависимость от IRepositoryFactory? Кажется добрым неловко. – Marcus

+1

Что кажется неудобным, так это то, что для репозитория требуется настроенное и активное подключение к функции. Какой ORM вы используете? Он чувствует себя очень ошибочным. –

+0

Теперь я понял, что наш DAL, который мы в настоящее время используем, был инициализирован при построении, и это была наша настоящая проблема, я просто завернул его в другой класс, который не был инициализирован в конструкторе, а затем я смог ввести IRepository в приложение shell без каких-либо проблем. Так что это не проблема IoC, когда вы смотрите на нее. Но в любом случае спасибо за ваш блог-пост. – Marcus

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