针对特定类类型的Autofac扫描assembly

我已经开始使用Autofac并希望扫描一些DLL并让Autofac注册其中的一些类。

我感兴趣的类都inheritance自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>(); //pluginClasses is empty!!!! 

我认为您需要在注册时指定插件的基类。 调用AsImplementedInterfaces使用其实现的接口而不是基类型来注册类型。 您应该更新您的注册以将插件注册为PluginBase。

这是代码:

 var assemblies = AppDomain.CurrentDomain.GetAssemblies(); var builder = new ContainerBuilder(); builder.RegisterAssemblyTypes(assemblies) .Where(t => t.BaseType == typeof(PluginBase)) .As(); var container = builder.Build(); var pluginClasses = container.Resolve>(); 

也许就是这样:

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

在这段代码中,我使用IDependency作为标记接口。 您可以将其替换为PluginBase类并删除Where方法。

关键是要使用IsAssignableFrom方法。