Ответ 1
Это правильный способ:
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces()
.InstancePerRequest();
В 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();
Правильно ли это?
Это правильный способ:
builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces()
.InstancePerRequest();
Для UWP правильный путь немного изменен:
var assemblyType = typeof(MyCustomAssemblyType).GetTypeInfo();
builder.RegisterAssemblyTypes(assemblyType.Assembly)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces()
.InstancePerRequest();
Для каждой сборки вы берете один тип, который принадлежит сборке и извлекает из него сборку. Затем запустите построитель этой ссылки. Повторить.
Вы можете использовать предикат 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]);
Иногда 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();