Допустим, у меня есть CLASUnity Контейнер - Ленивый инъекции
class Foo : FooBase {
public Foo(Settings settings, IDbRepository db)
: base(settings) {
this.db = db;
}
...
}
В основном FooBase получает настройки с помощью конструктора и загружает некоторые конфигурации из файла конфигурации.
Тогда у меня есть класс, который реализует MySQLRepository IDbRepository
class MySQLRepository : IDbRepository {
...
public MySQLRepository(IConfigurationRepository config) {
conn = new MySQLConnection(config.GetConnectionString());
}
...
}
в Program.cs я есть:
Foo foo = container.Resolve<Foo>();
Проблема заключается в том, что конструктор FooBase вызывается только после того, как все другие зависимости были загружен. но конфигурация не загружается до тех пор, пока не будет вызван конструктор FooBase.
Моя идея - создать ленивую реализацию IDbRepository и любых других интерфейсов, требующих конфигурации.
Это хорошая идея? Как реализовать его с контейнером Unity?
* Проблема заключается в том, что конструктор FooBase вызывается только после загрузки всех других зависимостей. но конфигурация не загружается до тех пор, пока не вызывается конструктор FooBase. * Что? вы пытаетесь сказать? почему это? является ли проблема регистрации в вашем контейнере DI? 'IConfigurationRepository' является зависимым от' MySQLRepository', который разрешен как 'IDbRepository', который является зависимостью от' Foo' - граф зависимостей довольно прямолинейный, поэтому я не сталкиваюсь с проблемой, с которой вы сталкиваетесь. . (btw: 'IDbRepository' не подключен к' FooBase.ctor') –
config.GetConnectionString() обращается к конфигурации приложения. Однако конфигурация приложения загружается только в конструкторе BaseFoo (у меня нет доступа к этому классу). Unity разрешает IDbRepository (и вызывает конструктор MySQLRepository) до вызова конструктора BaseFoo. Таким образом, конструктор MySQLRepository, который пытается загрузить строку соединения из конфигурации, вызывается до того, как строка соединения будет извлечена из конфигурации приложения (в конструкторе BaseFoo). – areller
Код с круговыми зависимостями очень сложно рассуждать. Было бы намного лучше, если бы люди, смотрящие на код позже, удалили круговую зависимость более разумным образом, чем попытка ленивой загрузки. –