zoukankan      html  css  js  c++  java
  • 组件 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专用 每个请求一个对象
    //建议最好配置 成无状态的(无状态既实现类中不要有成员比变量),使用单例方式最好.

  • 相关阅读:
    GIT初探
    IIS7添加虚拟目录映射另一台服务器的共享文件夹
    The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF
    asp.net编码解码的两篇文章
    生成网站时提示 已预编译此应用程序
    错误 1 无法将程序集“NBear.Data.dll”复制到文件“D: ewbpmpmSureBpmBinNBear.Data.dll”。无法将“D: ewbpmpmSureSoft.WebServiceBaseLibinDebugNBear.Data.dll”添加到网站。 无法添加文件“BinNBear.Data.dll”。 拒绝访问。 D:..
    从Script到Code Blocks、Code Behind到MVC、MVP、MVVM(转载)
    HTML form表单的默认提交方式
    webapp检测手机运动方向,可实现手机摇一摇功能的触发
    手机/P各种提示框整合,纯js实现,比前端大多数框架的提示消息更好用
  • 原文地址:https://www.cnblogs.com/x666066/p/10241681.html
Copyright © 2011-2022 走看看