Autofac Scanning Assemblies для определенного типа класса
Я начал использовать Autofac и хочу сканировать некоторую DLL и получить Autofac для регистрации некоторых классов внутри них.
Классы, которые меня интересуют, все наследуются от класса PluginBase, но приведенный ниже код, похоже, не регистрирует их. Может ли кто-нибудь помочь?
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(assemblies)
.Where(t => t.BaseType == typeof(PluginBase))
.AsImplementedInterfaces()
.AsSelf();
var container = builder.Build();
var pluginClasses = container.Resolve<IEnumerable<PluginBase>>();
//pluginClasses is empty!!!!
Ответы
Ответ 1
Я думаю, вам нужно указать базовый класс ваших плагинов при регистрации. Вызов AsImplementedInterfaces регистрирует тип с его реализованными интерфейсами, а не по его базовому типу. Вы должны обновить свою регистрацию, чтобы зарегистрировать свои плагины как PluginBase.
Вот код:
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(assemblies)
.Where(t => t.BaseType == typeof(PluginBase))
.As<PluginBase>();
var container = builder.Build();
var pluginClasses = container.Resolve<IEnumerable<PluginBase>>();
Ответ 2
Может быть, так:
builder
.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
.Where(t => t.GetInterfaces()
.Any(i => i.IsAssignableFrom(typeof (IDependency))))
.AsImplementedInterfaces()
.InstancePerDependency();
В этом коде я использую IDependency
как интерфейс маркера. Вы можете заменить его классом PluginBase
и удалить метод Where
.
Цель состоит в том, чтобы использовать метод IsAssignableFrom
.