DryIoC в библиотеках классов
У меня довольно простое решение:
Веб-проект -> Сервисный слой -> Хранилища
Мой класс IoCbootstrapper находится в моем веб-проекте.
var c = new Container();
c.Register<IUserService, UserService>();
c.Register<ILoggingService, LoggingService>();
Это нормально, но мои услуги зависят от хранилищ.
Есть ли способ иметь "частичный загрузчик" в библиотеке классов сервисного уровня, который затем будет каким-то образом передан как конфигурация в веб-проект, поскольку таким образом невозможно создать экземпляр сервиса, поскольку веб-проект не знает о репозиториях?
2 ответа
Сделайте так, чтобы сервисный уровень представлял действие, которое принимает контейнер и регистрирует то, что необходимо.
Сервисный слой, который ссылается на хранилища
namespace Project.ServiceLayer {
public static class DryIocExtesnions {
public static void AddServiceLayer(this IContainer c) {
c.Register<IUserRepository, UserRepository>();
c.Register<IOtherRepository, OtherRepository>();
}
}
}
IoCbootstrapper находится в веб-проекте.
var c = new Container();
c.Register<IUserService, UserService>();
c.Register<ILoggingService, LoggingService>();
//Register service layer
c.AddServiceLayer();
отступление, в зависимости от ваших предпочтений, заключается в том, что теперь сервисный уровень должен знать о проблемах со стороны корня композиции. Вы можете абстрагировать свой собственный контейнер, но это может быть излишним.
Может быть, вы можете использовать container.WithAutoFallbackResolution
с репозиториями сборок, или некоторым вариантом container.RegisterMany