针对特定类类型的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
方法。