У меня довольно простая настройка решения:

Веб-проект -> Уровень обслуживания -> Репозитории

Мой класс IoCbootstrapper находится в моем веб-проекте.

var c = new Container();
c.Register<IUserService, UserService>();        
c.Register<ILoggingService, LoggingService>();

Это нормально, но мои услуги зависят от репозиториев.

Есть ли способ иметь "частичный bootrapper" в библиотеке классов уровня сервиса, который затем каким-то образом передавался бы в качестве конфигурации в веб-проект, поскольку таким образом нельзя создать экземпляр сервиса, поскольку веб-проект не знает о репозиториях?

1
talfirevic 27 Ноя 2016 в 15:00

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();

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

1
Nkosi 27 Ноя 2016 в 17:31

Возможно, вы можете использовать container.WithAutoFallbackResolution со сборками репозиториев или какой-либо вариант container.RegisterMany

0
dadhi 30 Ноя 2016 в 21:03