zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    KnockoutJS 3.X API 第五章 高级应用(4) 自定义处理逻辑
    KnockoutJS 3.X API 第五章 高级应用(3) 虚拟元素绑定
    KnockoutJS 3.X API 第五章 高级应用(2) 控制后代绑定
    KnockoutJS 3.X API 第五章 高级应用(1) 创建自定义绑定
    KnockoutJS 3.X API 第四章(14) 绑定语法细节
    KnockoutJS 3.X API 第四章(13) template绑定
    KnockoutJS 3.X API 第四章 表单绑定(12) selectedOptions、uniqueName绑定
    KnockoutJS 3.X API 第四章 表单绑定(11) options绑定
    KnockoutJS 3.X API 第四章 表单绑定(10) textInput、hasFocus、checked绑定
    KnockoutJS 3.X API 第四章 表单绑定(9) value绑定
  • 原文地址:https://www.cnblogs.com/wangjinya/p/12797392.html
Copyright © 2011-2022 走看看