• 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

  • 相关阅读:
    6389. 【NOIP2019模拟2019.10.26】小w学图论
    6383. 【NOIP2019模拟2019.10.07】果实摘取
    三分查找求极值
    51Nod 1278 相离的圆
    51 Nod 1092 回文字符串
    关于原根(来自百度百科)
    Hdu 1358 Period
    最大子矩阵和
    51 Nod 1072 威佐夫游戏
    The 2018 ACM-ICPC Asia Qingdao Regional Contest, Online(2018 青岛网络预选赛)
  • 原文地址:https://www.cnblogs.com/wangjinya/p/12797392.html
Copyright © 2020-2023  润新知