2016-05-20 7 views
2

Так что я использую autofac в MVC, поэтому мои контроллеры могут иметь там зависимости, вложенные там конструктором, у меня есть в моем Global.asax. У меня есть следующий фрагмент кода, который работает.Использование Autofac для регистрации всего, что заканчивается сервисом

// Register your MVC controllers. 
builder.RegisterControllers(typeof(MvcApplication).Assembly); 

builder.RegisterType<PurchaseOrderSearchService>().As<IPurchaseOrderSearchService>().WithParameter("context", new PurchaseOrderManagerContext()); 

// Set the dependency resolver to be Autofac. 
var container = builder.Build(); 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

Проблема заключается в том, я не хочу делать builder.RegisterType снова и снова, все мои услуги. Итак, как мне это сделать?

Я думаю, что-то, что я хочу

builder.RegisterAssemblyTypes(foo) 
    .Where(t => t.Name.EndsWith("Services")) 
    .WithParameter("context", new PurchaseOrderManagerContext()); 

Но понятия не имею, что Foo не должно быть. Или если RegisterAssemblyTypes правильный путь. Я знаю, что кодирование по соглашению является решением, но не уверен, что такое соглашение. Все мои услуги закончится ИНТ слово Service и будет иметь интерфейсу

так FooService будет иметь интерфейс IFooService и BarService будет иметь интерфейс IBarService

Следует также отметить, что все услуги, жить в библиотеке классов под названием PurchaseOrderManager. Служба

ответ

5

Вы на правильном пути. «Foo» должен быть узел, содержащий типы для регистрации - если вы используете один узел, то следующее должно работать:

builder.RegisterAssemblyTypes(typeof(MvcApplication).Assembly) 
    .Where(t => t.Name.EndsWith("Services")) 
    .WithParameter("context", new PurchaseOrderManagerContext()) 
    .AsImplementedInterfaces(); 

.AsImplementedInterfaces() необходимо зарегистрировать их в качестве IFooService - без него, они бы только быть зарегистрирован как FooService и т.д.

Если ваши классы живут в отдельной сборке, я обычно рекомендую вам определить модуль autofac внутри этой сборки:

public class ServiceModule : Module 
{ 
    protected override void Load(ContainerBuilder builder) 
    { 
     // "ThisAssembly" means "any types in the same assembly as the module" 
     builder.RegisterAssemblyTypes(ThisAssembly) 
      .Where(.... 
    } 
} 

Тогда регистрация это в вашем веб-приложения:

builder.RegisterModule<PurchaseOrderManager.Service.ServiceModule>(); 

В качестве альтернативы, использовать мое первоначальное предложение, но явно указать сборку, содержащую услуги:

builder.RegisterAssemblyTypes(typeof(PurchaseOrderManager.Service.FooService).Assembly) 
    .Where(t => t.Name.EndsWith("Services")) 
    .WithParameter("context", new PurchaseOrderManagerContext()) 
    .AsImplementedInterfaces(); 

Вам просто нужно выбрать любой класс, который существует в этой сборке.

+0

Привет, я думаю, это то, что я хочу ... но у меня есть все службы, живущие в библиотеке классов под названием PurchaseOrderManager.Service, так что это ошибка бросания. Ни один из конструкторов, найденных с помощью «Autofac.Core.Activators.Reflection.DefaultConstructorFinder 'on type' PurchaseOrderManager.Controllers.PurchaseOrderSearchController 'может быть вызван с доступными службами и параметрами: Не удается разрешить параметр' PurchaseOrderManager.Service.Services.Interfaces.IPurchaseOrderSearchService service 'конструктора' Void .ctor (PurchaseOrderManager.Service.Services.Interfaces .IPurchaseOrderSearchService). –

+0

Ответ обновлен. – Richard

+0

Я пошел с автофокусом. Я защитил переопределение аннулируется нагрузки (ContainerBuilder строитель) { // «ThisAssembly» означает «любые типы в той же сборке, что и модуль» builder.RegisterAssemblyTypes (ThisAssembly) .гд (т => t.Name.EndsWith («Услуги»)) . С параметром «контекст», новый PurchaseOrderManagerContext()) .AsImplementedInterfaces(); } Но это никогда не получится вызвано, так как оно не переусердствует ничем как его класс libary –

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

  • Нет связанных вопросов^_^