Autofac Scanning Сборки для определенного типа класса - PullRequest
13 голосов
/ 06 февраля 2012

Я начал использовать 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!!!!

Ответы [ 2 ]

19 голосов
/ 06 февраля 2012

Я думаю, вам нужно указать базовый класс ваших плагинов при регистрации. Вызов 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>>();
7 голосов
/ 06 февраля 2012

Возможно сделать так:

builder
    .RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
    .Where(t => t.GetInterfaces()
        .Any(i => i.IsAssignableFrom(typeof (IDependency))))
    .AsImplementedInterfaces()
    .InstancePerDependency();

В этом коде я использую IDependency в качестве интерфейса маркера. Вы можете заменить его классом PluginBase и удалить метод Where.

Смысл в том, чтобы использовать метод IsAssignableFrom.

...