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

  • 相关阅读:
    Linux命令选项及参数解析 getopt() getopt_long() 函数
    找不到文件或程序集名称“DreamweaverCtrls”的解决方法
    #include file 与#include virtual的区别
    用dw(dreamweaver)开发asp.net,连接数据库时出现“http错误500,服务器内部错误”的解决方法
    [ASP.Net]ASP.NET中上传文件
    [.net]"Request.Form出现乱码"的解决方法
    正式进驻博客园
    [ASP.NET] 限制上传文件类型的两种方法(转)
    错误类型:“系统找不到 Microsoft.Office.Interop.Word"
    从客户端检测到有潜在危险的Request.Form 值
  • 原文地址:https://www.cnblogs.com/x666066/p/10241681.html
Copyright © 2011-2022 走看看