针对特定类类型的Autofac扫描装配

时间:2012-02-06 11:14:56

标签: c# .net inversion-of-control autofac

我开始使用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!!!!

3 个答案:

答案 0 :(得分:19)

我认为您需要在注册时指定插件的基类。调用 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>>();

答案 1 :(得分:7)

也许就是这样:

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

在此代码中,我使用IDependency作为标记界面。您可以将其替换为PluginBase类,然后移除Where方法。

重点是使用IsAssignableFrom方法。

答案 2 :(得分:0)

请注意,由于与重新启动 IIS 相关的问题,您不应使用 AppDomain.CurrentDomain.GetAssemblies()

<块引用>

在 IIS 中托管应用程序时,所有程序集都加载到 AppDomain 当应用程序第一次启动时,但是当 AppDomain 是 由 IIS 回收,然后仅按需加载程序集

要避免此问题,请改用 GetReferencedAssemblies() 上的 System.Web.Compilation.BuildManager 方法来获取引用程序集的列表:

var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();

这将强制引用的程序集立即加载到 AppDomain 中,使其可用于模块扫描。

有关更多详细信息,您可以在这里阅读:https://autofac.readthedocs.io/en/latest/faq/iis-restart.html