安装Autofac.Extensions.DependencyInjection包
在programe.cs下
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
//改用Autofac来实现依赖注入
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
主要是这句代码
//改用Autofac来实现依赖注入
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
在StartUp中增加
//autofac 新增
public void ConfigureContainer(ContainerBuilder builder)
{
//直接用Autofac注册我们自定义的
//builder.RegisterType<UserService>().As<IUserService>().InstancePerLifetimeScope().AsImplementedInterfaces();
builder.RegisterModule(new AutofacConfig());
}
我的AutofacConfig类如下
public class AutofacConfig : Autofac.Module {
protected override void Load(ContainerBuilder builder) {
//base.Load(builder);
//重写Autofac管道中的Load方法,在这里注入注册的内容
//builder.RegisterType<ServiceA>().As<IServiceA>().InstancePerLifetimeScope();
//以程序集形式注册
//获取以My开头的dll程序集的集合利用Directory.GetFiles获取dll,利用Assembly.LoadFrom委托select来对刚才的每个dll文件进行获取集合
Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "My*.dll").Select(Assembly.LoadFrom).ToArray();
//注册所有实现了 IDependency 接口的类型
Type baseType = typeof(IDependency);
builder.RegisterAssemblyTypes(assemblies)
.Where(b => !b.IsAbstract && baseType.IsAssignableFrom(b))//IsAssignableFrom是否实现了基类的接口这里指的是IDependency
.AsSelf().AsImplementedInterfaces().PropertiesAutowired().InstancePerLifetimeScope();
//Castle AOP
builder.Register(c => new TranscationAop());
//注册AspectCore
builder.RegisterDynamicProxy();
//builder.RegisterType<DocTypeCache>().AsImplementedInterfaces().Named<ICacheData>("DocTypeCache").PropertiesAutowired().InstancePerLifetimeScope().EnableInterfaceInterceptors();
builder.RegisterType<DepCache>().AsImplementedInterfaces().Named<ICacheData>("DepCache").PropertiesAutowired().InstancePerLifetimeScope().EnableInterfaceInterceptors();
builder.RegisterType<UserCache>().AsImplementedInterfaces().Named<ICacheData>("UserCache").PropertiesAutowired().InstancePerLifetimeScope().EnableInterfaceInterceptors();
//注册系统所有Controller,由Autofac创建
//var IControllerType = typeof(ControllerBase);
//builder.RegisterAssemblyTypes(assemblies).Where(t =>
// IControllerType.IsAssignableFrom(t) && t != IControllerType).PropertiesAutowired();
// var controllersTypesInAssembly = typeof(Startup).Assembly.GetExportedTypes()
//.Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToArray();
// builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired();
// builder.RegisterType<SysMenuService>().As<ISysMenuService>().PropertiesAutowired().InstancePerLifetimeScope();
//注册所有控制器
//autofac来实现属性注入
var controllersTypesInAssembly = typeof(Startup).Assembly.GetExportedTypes()
.Where(type => typeof(ControllerBase).IsAssignableFrom(type)).ToArray();
builder.RegisterTypes(controllersTypesInAssembly).PropertiesAutowired();
}
}
如果要属性注入则在StartUp中 public void ConfigureServices(IServiceCollection services)
加入
services.AddControllersAsServices() //use by property DI