2013-08-16 3 views
1

Я пытаюсь зарегистрировать свои «сервисы» с помощью AutoFac. Сервисы называются на основе соглашения (Aggregate Root + «Service»), и все реализуют интерфейсы с тем же именем: «I» + ServiceName. Например, OrderService реализует IOrderService.Как регистрировать службы и типы, которые находятся в отдельных сборках в AutoFac?

Однако конкретные типы и интерфейсы находятся в отдельных сборках. До сих пор у меня есть следующий код:

builder.RegisterAssemblyTypes(typeof(OrderService).Assembly) 
     .Where(t => t.Name.EndsWith("Service")) 
     .AsImplementedInterfaces(); 

Это лучший способ добиться этого в AutoFac? Что делать, если некоторые из моих услуг происходят из абстрактного класса?

ответ

3

Autofac не заботится о том, находятся ли эти интерфейсы в одной и той же сборке или нет. Так что ваша регистрация делает просто отлично, но если вы хотите загрузить «услуги» из нескольких сборок, вы можете просто передать в коллекции узлов:

builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies()) 
    .Where(t => t.Name.EndsWith("Service")) 
    .AsImplementedInterfaces(); 

Я хотел бы предупредить вас о некоторых postfixes класса, которые указывают на SRP violations, и RAP violations, таких как Helper, Manager, и ... Service. Возможно, вам захочется попробовать другой дизайн, где каждый запрос и пример использования такого класса обслуживания помещается в его собственный класс и помечен with a generic interface. Таким образом, вы можете зарегистрировать все реализации одного и того же общего интерфейса с одной строкой:

builder.RegisterAssemblyTypes(
    AppDomain.CurrentDomain.GetAssemblies()) 
    .AsClosedTypesOf(typeof(ICommandHandler<>)); 
+0

Стивен, замечательная точка зрения о нарушениях SRP и RAP. У меня есть общий интерфейс для моего репозитория, но он полностью игнорирует эти службы. Я был вдохновлен вашими сообщениями о разделении комманд-запросов и будет стремиться следовать этому шаблону в ближайшем будущем. – Karl

Смежные вопросы