直入主题 ,用原版ioc的话只需要现在类库中引用包
然后就和普通控制器一样,继承ControllerBase,然后标记上特性就可以使用
如果是使用autofac作为ioc,那么就要稍微改一下
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
使用autofac代替默认的ioc容器
builder.Host.ConfigureContainer<ContainerBuilder>(x => { x.RegisterType<Data>().As<IData>().PropertiesAutowired();//正常注入代码 });
如果使用构造函数注入的话,那么就搞定了
如果你要是用属性注入,代码还需要修改一下
builder.Host.ConfigureContainer<ContainerBuilder>(x => { x.RegisterType<Data>().As<IData>().PropertiesAutowired();//正常注入代码 var controllersTypesInAssembly = typeof(WebAp.Program).Assembly.GetExportedTypes() .Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToArray(); var controllersTypesInAssembly2 = typeof(APiClassLibrary.CAController).Assembly.GetExportedTypes() .Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToArray(); x.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired(); x.RegisterTypes(controllersTypesInAssembly2).PropertiesAutowired(); });
我这里项目分为
WebAp和APiClassLibrary里面都有控制器,因此需要分别获取他们的程序集,然后筛选里面继承了ControllerBase的类,最后在注册在ioc里面.
获取程序集也可以通过这种方式.
Assembly.Load("*.*.*").GetExportedTypes().Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToArray();
最后需要流式调用方法 AddControllersAsServices()把控制器作为类通过ioc注册
builder.Services.AddControllers() .AddControllersAsServices();
网上有些代码写得是这段代码
builder.Services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());
可以直接使用上面的 .AddControllersAsServices() 这个的源码里包括了上面的代码
做完这些 就可以愉快的使用autofac属性注入,并且控制器和项目分离了
标签:类库,core,控制器,asp,ControllerBase,ioc,builder,typeof,type From: https://www.cnblogs.com/czb071/p/18057048