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

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!!!!
4b9b3361

Ответ 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.