AutoFac的使用
AutoFac是一个比较流行的依赖注入容器,我这里做下笔记。
依赖注入的作用好处这些就不说了,自己也清楚,主要记一下AutoFac的使用
项目模板使用的是Asp.net core 3.0 实际上没有什么有用的代码,连页面展示都没有
AutoFac的基本使用
1、创建接口项目和实现类项目
2、使用Nuget安装AutoFac,安装在MVC项目中
3、在Controller中创建容器,注入使用
IUserInfoService和IProductService接口项目代码展示


UserInfoService和ProductService实现类代码


MVC项目中使用Nuget安装Autofac: 命令:Install-Package AutoFac

在HomeController中使用AutoFac:
ContainerBuilder builder = new ContainerBuilder(); // 创建容器的Builder
builder.RegisterType<UserInfoService>().As<IUserInfoService>(); // 注册服务(实现类UserInfoService),
当请求IUserInfoService接口的时候返回UserInfoService类的实例
IContainer container = builder.Build(); // 创建一个容器
IUserInfoService userInfoService = container.Resolve<IUserInfoService>(); // 请求IUserInfoService返回的是实现类UserInfoService的实例

builder.RegisterType<UserInfoService>().As<IUserInfoService>(); 注册服务可以写成 builder.RegisterType<UserInfoService>().AsImplementedInterfaces();
builder.RegisterType<UserInfoService>().AsImplementedInterfaces(); // 请求UserInfoService的实现的任何接口都会返回UserInfoService实例

再新建一个接口IRoleService,定义delete方法,让UserInfoService实现,这时候,UserInfoService就实现了IUserInfoService和IRoleServies两个接口

然后就可以向依赖注入容器请求返回两个UserInfoService实例,执行各自接口的方法,
这就是使用了 builder.RegisterType<UserInfoService>().AsImplementedInterfaces(); 方式注册服务的好处

上面的方式注册,每个接口的实现类向容器注册,UserInfoService向容器注册:builder.RegisterType<UserInfoService>().AsImplementedInterfaces();
如果再来一个RoleService向容器注册,就得在写一次builder.RegisterType<RoleService>().AsImplementedInterfaces();再有很多实现,这样就很麻烦了,
所有我有以下方式注册:
Assembly assembly = Assembly.Load("Service"); // 加载所有实现类程序集
builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces();// 注册所有实现类程序集和其实现的接口
这样,向实现类程序集里所有的实现类所实现的接口请求实例都会得到对应的实现类实例(太绕了)。

如果实现类是多个程序集,也可以加载多个程序集注册

属性注入:如果ProductService实现类中要使用到UserINfoService实例,那么就可以在注册的时候加上PropertiesAutowired();方法
builder.RegisterAssemblyTypes(assembly, assembly1).AsImplementedInterfaces().PropertiesAutowired(); // PropertiesAutowired()是属性注入
在ProductService中定义IUserInfoService类型的实例使用容器会自动注入IUserInfoService实现类UserINfoService的实例,
注意,前提是UserInfoService和IUserInfoService是容器所管理的,就是注册到容器的


AutoFac对象的生命周期
1、PerDependenc: 每次请求Resolve都返回一个新的对象;InstancePerDependy()
2、SingleInstance:单例;每次都返回同一个对象;SingleInstance()
3、PerLitimeScope:每个生命周期一个对象;PerLitimeScope()
4、IntancePerRequest:每个MVCweb请求一个对象;IntancePerRequest()
使用方式,下注册的时候加上对应的生命周期方法就OK
builder.RegisterAssemblyTypes(assembly, assembly1).AsImplementedInterfaces().PropertiesAutowired().SingleInstance();


浙公网安备 33010602011771号