首先解答一下为什么我写的博客样式这么丑。

  首先博客园的这个富文本框是真的差,然后就是其实我可以自己写样式来修改,但是真的感觉是没有必要花费大把的时间用在没用的东西上,内容才是核心,哈哈哈!!!开始正文。

一、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