• 组件 Autofac 实现接口类工具


    IOC 控制反转容器 autofac
    IOC概念:当我们写程序 所有对象都是手动new的,当项目大了的坏处:
    1>各模块之间耦合严重
    2>想要更换其他实现类很麻烦
    3>有的程序员只关心"该我一个实现**接口的类",他不关心如何来的

    IOC 使用框架实现new对象 使用方法:实现类的接口 IUserBll ubll=new IUserBll(); ubll.方法();
    IOC容器有很多 Spring.NET Unity Castls Autofac Autofac最火
    Autofac基本使用:
      1)创建 接口类库  ,实现类库  ,并添加引用

    用户接口:

    public interface IUserBll
    {

    //检查
    bool Check(string username, string pwd);

    //添加
    void AddNew(string p1, string p2);
    }

    狗儿接口:

    public interface IDogBll
    {

    //狗叫
    void Bark();
    }

    用户实现类:

    public class UserBll : IUserBll
    {
    public bool Check(string username, string pwd)
    {
    Console.WriteLine("检查登录, username=" + username);
    return true;
    }

    public void AddNaew(string username, string pwd)
    {
    Console.WriteLine("新增用户, username="+username);
    }
    }

    狗儿实现类:

    public void Bark()
    {
    Console.WriteLine("汪汪汪~~~");
    }

      2) 安装程插件:install-package autofac
      3)创建一个容器

    ContainerBuilder builder = new ContainerBuilder();
    4)注册实现类Service1请求IService接口,同时返回Service1对象 Service1类是IService1接口的实现类
    把UserBll注册为IUserBll的实现类


    builder.RegisterType<UserBll>().As<IUserBll>();                    //等同于下面
    builder.RegisterType<UserBll>().AsImplementedInterfaces(); //表示UserBll的所有接口都实现
    builder.RegisterType<DogBll>().AsImplementedInterfaces();

    当类库很多  我们无法知晓那些类库接口还没有被实现

    为了解决这个问题,我们简化代码

    //获取所有类Assembly asm=Assembly.Load("当前项目名称") ;并注册为实现类


    Assembly asm = Assembly.Load("Pro");
    builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces();

    IContainer resolver = builder.Build();
    //创建IUserBll实现类的对象 bll
    IUserBll bll = resolver.Resolve<IUserBll>();

    bll.AddNew("aa", "123");
    IDogBll dbll = resolver.Resolve<IDogBll>();
    dbll.Bark();

    //假设IUser接口被多个类实现 获取类的方法:
    IEnumerable<IUserBll> blls = resolver.Resolve < IEnumerable<IUserBll>>();
    foreach (IUserBll userbll in blls)
    {
    Console.WriteLine(userbll.GetType());
    userbll.AddNew("测试", "11");
    }

    //属性注入:(只有被Autofac创建的对象才会被--属性自动注入)
    //如果一个接口实现类中调用另一个接口实现类 需要在这个类中声明调用类的属性
    //既: public IDogBll DogBll{get;set}即可
    //使用时全部注册后面加.PropertiesAutowired();即可
    builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces().PropertiesAutowired();


    //Autofac 生命周期
    //1>PerDependency 每次请求Resovle 都返回一个新对象: PerDependency();
    //2>SingleInstance 单列 每次返或同一个对象: SingleInstance()
    //3>PerLifetimeScope 每个生命周期一个对象
    //4>InstancePreRequest Asp.Mvc专用 每个请求一个对象
    //建议最好配置 成无状态的(无状态既实现类中不要有成员比变量),使用单例方式最好.

  • 相关阅读:
    [RxSwift教程]14、其他操作符:delay、materialize、timeout等
    [RxSwift教程]13、连接操作符:connect、publish、replay、multicast
    Java虚拟机类加载机制及双亲委派模式分析
    面试系列-如何设计一个类
    谈谈 MySQL 的 JSON 数据类型
    Java 多线程编程(2-异步中包含同步)
    还堵在高速路上吗?带你进入Scratch世界带你飞
    SQL Server SSIS相关介绍
    SQL Server开启READ_COMMITTED_SNAPSHOT
    SqlServer中select语句引起的死锁
  • 原文地址:https://www.cnblogs.com/x666066/p/10241681.html
Copyright © 2020-2023  润新知