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

Другие вопросы по тегам