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