Autofac介绍和使用
首先解答一下为什么我写的博客样式这么丑。
- 首先博客园的这个富文本框是真的差,然后就是其实我可以自己写样式来修改,但是真的感觉是没有必要花费大把的时间用在没用的东西上,内容才是核心,哈哈哈!!!开始正文。
一、IOC的概念。
1. 之前我们写程序的时候所有对象都是程序员手动new的,当项目大了之后这样做的坏处各模块之间耦合严重,想要更换为其他实现类的时候很麻烦
2. 有的程序员只关心“给我一个实现了**接口的类”,它不想关心这个类是怎么来的。因此就诞生了c( Inversion of Control,控制反转)容器。使用OC容器后,不再是由程序员自己new对象,而是由框架帮你new对象。
3. 现在1OC有很多: Spring. Net、 Unity、 Castle、 AutoFac等。目前最火的就是 AutoFac.
4. 使用oc容器的时候,一般都是建议基于接口编程,也就是把方法定义到接口中,然后再编写实现类。在使用的时候声明接口类型的变量、属性,由容器负责赋值。接口、实现类一般都是定义在单独的项目中,这样可以减少相互的耦合。
二、什么是Autofac?类似于的Autofac都有什么?
Autofac就是用来依赖注入的一个容器,用来解耦,并且由该容易来统一构建出对象。最开始我使用的容器时spring.net中的容器。
三、Autofac的实现于案例:
1. 新建一个接口类库项目

1 namespace MyIBLL 2 { 3 public interface IUserBll 4 { 5 bool Check(string username, string pwd); 6 void AddNew(string username, string pwd); 7 } 8 }
2. 实现接口的类库项目

1 namespace MyBllImpl 2 { 3 public class UserBll : IUserBll 4 { 5 public void AddNew(string username, string pwd) 6 { 7 Console.WriteLine("新增用户,username="+ username); 8 } 9 10 public bool Check(string username, string pwd) 11 { 12 Console.WriteLine("检查登录,username=" + username); 13 return true; 14 } 15 } 16 }
3. 最差劲的实现的方式如下:
IUserBll bll = new UserBll() :这是最开始最low的实现方式,其实感觉还不如直接new一个对象更简单。
4. 稍微进步一点的改善:该版本还是有点恶心的
1 //构建一个容器对象 2 ContainerBuilder builder = new ContainerBuilder(); 3 //把UserBll注册为IUserBll实现类 4 builder.RegisterType<UserBll>().As<IUserBll>(); 5 IContainer container = builder.Build(); 6 IUserBll bll = container.Resolve<IUserBll>();//new UserBll 7 Console.WriteLine(bll.GetType());
5. 再次改善
//拿到实现类的程序集 Assembly asm = Assembly.Load("MyBllImpl"); //创建该程序集下所有实现类对应对应的接口都进行关联。 builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces() .PropertiesAutowired().SingleInstance(); //创建一个容器 IContainer container = builder.Build(); //拿出一个对象 IUserBll bll = container.Resolve<IUserBll>();//new UserBll //使用 Console.WriteLine(bll.GetType());
7. 属性注入:如果一个实现类中定义了其他类型的接口属性,还可以在注册的时候加上PropertiesAutowired,也就是 AslmplementedInterfaces().PropertiesAutowired(还会自动给属性进行“注入”如果可能有多个实现类,还可以声明 numerable< Iservice1>类型的属性
case: 给对象添加一个属性
1 public class School : ISchool 2 { 3 //属性 4 public IDogBll DogBll { get; set; } 5 6 public void FangXue() 7 { 8 DogBll.Bark(); 9 Console.WriteLine("放学啦"); 10 } 11 }
在注册时候同时添加属性注入:builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces().PropertiesAutowired(),最后的SingleInstance()表示时一个单例模式的注入。
//拿到实现类的程序集 Assembly asm = Assembly.Load("MyBllImpl"); //创建该程序集下所有实现类对应对应的接口都进行关联。 builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces() .PropertiesAutowired().SingleInstance(); //创建一个容器 IContainer container = builder.Build(); //拿出一个对象 IUserBll bll = container.Resolve<IUserBll>();//new UserBll //使用 Console.WriteLine(bll.GetType());
8. AutoFac对象的生命周期
根据到底创建多少个对象, AutoFac有如下的生命周期,在 Register**后面以
nstance**()进行配置:
1) Per Dependency:每次请求 Resovle都返回一个新对象: Instance PerDependencyO
2) Single Instance:单例,每次都返回同一个对象: SinglelnstanceO
3) Per Lifetime Scope:每个生命周期一个对象;
4) InstancePerRequest: ASP. Net MVC专用,每个请求一个对象。 InstancePerRequest()
建议:最好配置成无状态的(实现类中不要有成员变量),并且使用单例方式
谢谢学习!!!
创作不易:请标明作品出处:https://www.cnblogs.com/wangjinya/p/12797392.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构