0

Я новичок в использовании Autofac, и я хочу упростить регистрацию. Установка моих запросов. т.е.Как упростить регистрацию компонентов с помощью Autofac

Bootstrapper.Builder.RegisterType<TableOneQuery>().As<ITableOneQuery>().InstancePerLifetimeScope(); 
Bootstrapper.Builder.RegisterType<TableTwoQuery>().As<ITableTwoQuery>().InstancePerLifetimeScope(); 
Bootstrapper.Builder.RegisterType<TableThreeQuery>().As<ITableThreeQuery>().InstancePerLifetimeScope(); 
Bootstrapper.Builder.RegisterType<TableFourQuery>().As<ITableFourQuery>().InstancePerLifetimeScope(); 
Bootstrapper.Builder.RegisterType<TableFiveQuery>().As<IFiveOneQuery>().InstancePerLifetimeScope(); 

Запросы одного и того же типа, и они следуют этому соглашению

public class TableOneQuery : ITableOneQuery 
    { 
     private readonly IGenericRepository<TableOne> _tableOneRepository; 

     public TableOneQuery(
      IGenericRepository<TableOne> tableOneRepository) 
     { 
      _tableOneRepository = tableOneRepository; 

     } 
     public TableOneViewModel Get(int id) 
     { 
      ..... 
     } 
     public IList<TableOneViewModel> GetAll() 
     { 
      ..... 
     } 
    } 

Есть ли способ просто зарегистрировать один раз для такого типа?

BTW Bootstrapper является Autofac.ContainerBuilder

+0

Похоже, было бы разумнее создать родительский интерфейс для каждого из ваших интерфейсов запросов и использовать его для открытой общей регистрации. –

+0

Возможно, имеет смысл определить одну общую абстракцию по запросам, например, пояснил [здесь] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=92). – Steven

ответ

1

Dynamically-provided registrations в Autofac включает assembly scanning найти и зарегистрировать автомагический тип.

var dataAccess = Assembly.GetExecutingAssembly(); 

builder.RegisterAssemblyTypes(dataAccess) 
    .Where(t => t.Name.EndsWith("Query")) 
    .AsImplementedInterfaces(); 
+0

Спасибо, что работает. У меня также есть другой вопрос: как насчет регистрации класса? public abstract class GenericRepository : IGenericRepository где T: класс. – Raymund

+1

Посмотрите строитель.RegisterGeneric для этого. – sudheeshix