Autofac
Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上非常高。
源码下载地址https://github.com/autofac/Autofac
- 控制反转(IoC/Inverse Of Control): 调用者不再创建被调用者的实例,由autofac框架实现(容器创建)所以称为控制反转。
- 依赖注入(DI/Dependence injection) : 容器创建好实例后再注入调用者称为依赖注入。
安装Autofac
Install-Package Autofac
1. 扫描类型 RegisterAssemblyTypes(接受1个或者多个程序集的数组),程序集必须是public的
1.1 过滤类型:Where()
1 2 | builder.RegisterAssemblyTypes(Assembly.LoadFile(servicesDllFile)) .Where(t => t.Name.EndsWith( "Services" )); |
1.2 排除类型: Except()
1 2 | builder.RegisterAssemblyTypes(Assembly.LoadFile(servicesDllFile)) .Except<myType>(ct =>ct.As<ISpecial>().SingleInstance()); |
AsImplementedInterfaces() : 表示注册的类型,以接口的方式注册,但不包括IDisposable接口
builder.RegisterAssemblyTypes(Assembly.LoadFile(servicesDllFile))
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces();
AsClosedTypesOf(open):可分配给注册类型一个接近开放泛型类型的实例
builder.RegisterAssemblyTypes(Assembly.LoadFile(servicesDllFile))
.AsClosedTypesOf(typeof(IRepository<>));
AsSelf() :默认: 注册类型本身 - 当重写其他服务默认规范时非常有用
builder.RegisterAssemblyTypes(Assembly.LoadFile(servicesDllFile))
.AsImplementedInterfaces()
.AsSelf();
2. 扫描模块 RegisterAssemblyModules() 册方法执行,它的名字是什么,就执行哪个,它通过Autofac 模块提供的程序集扫描,创建模块实例,然后使用当前container builder 注册他们。使用System.Web.Compilation.BuildManager中的GetReferencedAssemblies()方法,会得到一个引用程序集列表,
var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();
注入方法一:
1 2 3 4 5 6 | var builder = new ContainerBuilder(); builder.RegisterType<TestService>(); builder.RegisterType<TestDao>().As<ITestDao>(); return builder.Build(); |
注入方法二:
为了统一管理 IoC 相关的代码,并避免在底层类库中到处引用 Autofac 这个第三方组件,定义了一个专门用于管理需要依赖注入的接口与实现类的空接口 IDependency:
1 2 3 4 5 | /// <summary> /// 依赖注入接口,表示该接口的实现类将自动注册到IoC容器中 /// </summary> public interface IDependency { } |
这个接口没有任何方法,不会对系统的业务逻辑造成污染,所有需要进行依赖注入的接口,都要继承这个空接口,例如:
业务单元操作接口:
1 2 3 4 5 6 7 | /// <summary> /// 业务单元操作接口 /// </summary> public interface IUnitOfWork : IDependency { ... } |
Autofac 是支持批量子类注册的,有了 IDependency 这个基接口,我们只需要 Global 中很简单的几行代码,就可以完成整个系统的依赖注入匹配:
1 2 3 4 5 6 7 8 9 10 11 12 | ContainerBuilder builder = new ContainerBuilder(); builder.RegisterGeneric( typeof (Repository<,>)).As( typeof (IRepository<,>)); Type baseType = typeof (IDependency); // 获取所有相关类库的程序集 Assembly[] assemblies = ... builder.RegisterAssemblyTypes(assemblies) .Where(type => baseType.IsAssignableFrom(type) && !type.IsAbstract) .AsImplementedInterfaces().InstancePerLifetimeScope(); //InstancePerLifetimeScope 保证对象生命周期基于请求 IContainer container = builder.Build(); DependencyResolver.SetResolver( new AutofacDependencyResolver(container)); |
如此,只有站点主类库需要引用 Autofac,而不是到处都存在着注入的相关代码,大大降低了系统的复杂度。
1、InstancePerDependency
对每一个依赖或每一次调用创建一个新的唯一的实例。这也是默认的创建实例的方式。
2、InstancePerLifetimeScope
在一个生命周期域中,每一个依赖或调用创建一个单一的共享的实例,且每一个不同的生命周期域,实例是唯一的,不共享的。
3、InstancePerMatchingLifetimeScope
在一个做标识的生命周期域中,每一个依赖或调用创建一个单一的共享的实例。打了标识了的生命周期域中的子标识域中可以共享父级域中的实例。若在整个继承层次中没有找到打标识的生命周期域,则会抛出异常:DependencyResolutionException。
4、InstancePerOwned
在一个生命周期域中所拥有的实例创建的生命周期中,每一个依赖组件或调用Resolve()方法创建一个单一的共享的实例,并且子生命周期域共享父生命周期域中的实例。若在继承层级中没有发现合适的拥有子实例的生命周期域,则抛出异常:DependencyResolutionException。
5、SingleInstance
每一次依赖组件或调用Resolve()方法都会得到一个相同的共享的实例。其实就是单例模式。
6、InstancePerHttpRequest
在一次Http请求上下文中,共享一个组件实例。仅适用于asp.net mvc开发。
参考链接:
autofac 创建实例方法总结:http://www.cnblogs.com/manglu/p/4115128.html
AutoFac使用方法总结:Part I:http://niuyi.github.io/blog/2012/04/06/autofac-by-unit-test/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?