首先解答一下为什么我写的博客样式这么丑。
- 首先博客园的这个富文本框是真的差,然后就是其实我可以自己写样式来修改,但是真的感觉是没有必要花费大把的时间用在没用的东西上,内容才是核心,哈哈哈!!!开始正文。
一、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