Подтвердить что ты не робот

Типы сборки регистра Autofac

В Castle я использовал для регистрации типов из другой сборки:

Classes.FromAssemblyNamed("MyServer.DAL")
       .Where(type => type.Name.EndsWith("Repository"))
       .WithServiceAllInterfaces()
       .LifestylePerWebRequest(),

В Autofac я изменяю код выше:

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

Правильно ли это?

4b9b3361

Ответ 1

Это правильный способ:

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

Ответ 2

Для UWP правильный путь немного изменен:

   var assemblyType = typeof(MyCustomAssemblyType).GetTypeInfo();

   builder.RegisterAssemblyTypes(assemblyType.Assembly)
   .Where(t => t.Name.EndsWith("Repository"))
   .AsImplementedInterfaces()
   .InstancePerRequest();

Для каждой сборки вы берете один тип, который принадлежит сборке и извлекает из него сборку. Затем запустите построитель этой ссылки. Повторить.

Ответ 3

Вы можете использовать предикат As overload! Вы можете получить все интерфейсы с GetInterfaces из указанных типов, оканчивающихся на "Repository" а затем выбрать первый интерфейс, который они реализуют, и зарегистрировать его.

var assembly = Assembly.GetExecutingAssembly();
ContainerBuilder builder = new ContainerBuilder();

builder.RegisterAssemblyTypes(assembly)
    .Where(t => t.Name.EndsWith("Repository"))
    .As(t => t.GetInterfaces()[0]);

Ответ 4

Иногда AppDomain.CurrentDomain.GetAssemblies не возвращает сборки зависимых проектов. Подробное объяснение здесь Разница между AppDomain.GetAssemblies и BuildManager.GetReferencedAssemblies

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

var webAssembly = Assembly.GetExecutingAssembly();
var repoAssembly = Assembly.GetAssembly(typeof(SampleRepository)); // Assuming SampleRepository is within the Repository project
builder.RegisterAssemblyTypes(webAssembly, repoAssembly)
            .AsImplementedInterfaces();