Внедрение в конструктор приложения, в котором не удается инициализировать зависимости

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

Пример:

public class ApplicationShellPresenter(IRepository repository, IView view)
{

}

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

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

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

Edit:

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

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

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

1
задан Cœur 31 July 2017 в 02:01
поделиться

2 ответа

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

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.

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

1
ответ дан 2 September 2019 в 22:12
поделиться
1
ответ дан 2 September 2019 в 22:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: