ASP.NET WebApi + Autofac 实现依赖注入

2023-11-17

一、项目情况

框架:.NET Framework 4.5
Autofac 3.5.0
Autofac.WebApi2 4.3.0

二、定义接口与对应实现

// 接口1
public interface IBaseUserService
{
    List<BaseUser> GetBaseUserList();
}
// 接口2
public interface IBaseCloseLoopService
{
    List<BaseCloseLoop> GetBaseCloseLoopList();
}

// 实现1
public class BaseUserService : IBaseUserService
{
    public List<BaseUser> GetBaseUserList()
    {
        BaseUserDao dao = new BaseUserDao();
        return dao.GetModelList();
    }

}
// 实现2
public class BaseCloseLoopService : IBaseCloseLoopService
{
    public List<BaseCloseLoop> GetBaseCloseLoopList()
    {
        BaseCloseLoopDao dao = new BaseCloseLoopDao();
        return dao.GetModelList();
    }
}

 三、添加Autofac配置类

public class AutofacConfig
{
    public static Autofac.IContainer _container;

    public static void Configure()
    {
        var builder = new ContainerBuilder();
        var config = System.Web.Http.GlobalConfiguration.Configuration;

        // OPTIONAL: Register the Autofac filter provider.
        //builder.RegisterWebApiFilterProvider(config);
        // OPTIONAL: Register the Autofac model binder provider.
        //builder.RegisterWebApiModelBinderProvider();
            
        // 指定接口的实现类
        builder.RegisterType<BaseUserService>().As<IBaseUserService>().AsImplementedInterfaces();
        builder.RegisterType<BaseCloseLoopService>().As<IBaseCloseLoopService>().AsImplementedInterfaces();
        // 一次性注册所有【实现了baseTyp接口的类】;不建议,无法指定接口实现类
        //Assembly[] assemblies = Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll").Select(Assembly.LoadFrom).ToArray();
        //List<Type> baseTypeList = new List<Type>()
        //{
        //    typeof(IBaseUserService),
        //    typeof(IBaseCloseLoopService)
        //};
        //builder.RegisterAssemblyTypes(assemblies).Where(type => baseTypeList.Any(t => t.IsAssignableFrom(type)) && !type.IsAbstract).AsSelf().AsImplementedInterfaces().PropertiesAutowired().InstancePerLifetimeScope();

        // 注册 Web API Controllers
        builder.RegisterApiControllers(System.Reflection.Assembly.GetExecutingAssembly());
        _container = builder.Build();
        config.DependencyResolver = new AutofacWebApiDependencyResolver(_container);
    }
}



// ================================ 分割线 ==========================================

// 以下为ASP.NET MVC的Autofac配置,注意引用的DLL有所不同,此处不详述
public class AutofacConfig
{
    public static Autofac.IContainer _container;
    public static void Register()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<BaseCloseLoopService>().As<IBaseCloseLoopService>();
        builder.RegisterControllers(System.Reflection.Assembly.GetExecutingAssembly());
        _container = builder.Build();
        System.Web.Mvc.DependencyResolver.SetResolver(new Autofac.Integration.Mvc.AutofacDependencyResolver(_container));
    }
}

四、在Global.asax引用配置

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        //autofac ioc配置
        AutofacConfig.Configure();
    }
}

五、ApiController使用

public class CloseLoopController : ApiController
{
    // 需要注入的接口
    private readonly IBaseUserService _baseUserService;
    private readonly IBaseCloseLoopService _baseCloseLoopService;
    /// <summary>
    /// 构造函数注入
    /// </summary>
    /// <param name="baseUserService"></param>
    /// <param name="baseCloseLoopService"></param>
    public CloseLoopController(IBaseUserService baseUserService, IBaseCloseLoopService baseCloseLoopService)
    {
        _baseUserService = baseUserService;
        _baseCloseLoopService = baseCloseLoopService;
    }


    [HttpGet]
    public string GetBaseUser([FromBody] object json)
    {
        // 直接调用方法即可
        var result = _baseUserService.GetBaseUserList();
        return JsonConvert.SerializeObject(result);
    }

    [HttpGet]
    public string GetBaseCloseLoop([FromBody] object json)
    {
        var result = _baseCloseLoopService.GetBaseCloseLoopList();
        return JsonConvert.SerializeObject(result);
    }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET WebApi + Autofac 实现依赖注入 的相关文章

随机推荐

  • SPSS知识点复习

    一 T检验 对连续变量使用的方法 T检验 方差检验 1 均值 Means 过程 完成数据分组输出描述统计量 2 T检验 用t分布理论来推论差异发生的概率 从而比较两个平均数的差异是否显著 前提 总体服从正态分布 样本量不超过30 3 单样本
  • [Bug集合]terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc

    terminate called after throwing an instance of std bad alloc what std bad alloc 超内存了兄dei 我出现这个问题是因为读入了大量图片 结果系统提示这个信息
  • 解决flex布局中 space-between方法的排版问题

    flex布局中 justify content space between方法的排版问题 flex给我们的布局带来了很大的方便 但有时候也会碰到一些问题 比如space between最后一行元素的排列问题 问题 假如我们有8个元素 ul
  • Lethean结点搭建

    文章目录 结点搭建 日志位置 钱包地址 Lethean官网 https github com LetheanMovement lethean github地址 https github com LetheanMovement lethean
  • 华为OD机试真题-热点网站统计-2023年OD统一考试(B卷)

    题目描述 企业路由器的统计页面 有一个功能需要动态统计公司访问最多的网页URL top N 请设计一个算法 可以高效动态统计Top N的页面 输入描述 每一行都是一个URL或一个数字 如果是URL 代表一段时间内的网页访问 如果是一个数字N
  • String.format()方法使用详解技巧

    一 时间切割 String year String format tY 2020 04 30 2020 String month String format tm 2020 04 30 04 String day String format
  • [454]bokeh之bokeh.layouts

    如果希望在同一张图上显示多个图像 可以使用bokeh layouts类中的方法 row column gridplot widgetbox layout row row 的作用是将多个图像以行的方式放到同一张图中 from bokeh io
  • 出现Command ‘locate‘ not found,but can be installed with:apt install mlocate解决方法

    出现Command locate not found but can be installed with apt install mlocate解决方法 在使用Ubuntn出现Command locate not found but can
  • 以太坊区块链浏览器搭建

    链客 专为开发者而生 有问必答 此文章来自区块链技术社区 未经允许拒绝转载 当然 读者若要实践 那么电脑上必须已经搭建好了geth 并且命令 geth version 能显示版本信息 针对以太坊各个链 私链 公链 测试链 都可以用该篇文章来
  • Keil MDK误将Project窗口关了的解决办法,窗口视图重置

    在使用MDK时 误将Project窗口或者其他窗口关了 点击view 选择对应的窗口即可 或者点击Window窗口 选择Reset View to Defaults 再点击Reset即可实现窗口的重置
  • 项目管理:要做一项任务,不要做一堆事儿

    作为项目经理 我们最终的任务和目标是把项目高标准的完成 在完成最终目标的过程中离不开项目成员的协作配合和任务工作的分配 只有项目组成员各司其职 高效的完成各自的工作 才能保证项目的效率和质量 那么如何保证项目组成员在完成各自任务的时候既能保
  • 打包vue前端docker镜像

    1 安装好docker环境 docker v 查看是否成功 2编写Dockerfile文件 下面这个dokcerfile的RUN指令不好 当有多个命令需要执行的时候 可以用换行符和连接符隔开 而不是写多个RUN指令 因为那样会增加镜像的构建
  • Go基础(包、变量和函数):开启Go语言之旅

    开启Go语言之旅 Go编程语言是一个开源项目 可以让程序员提高工作效率 Go是富有表现力 简洁 干净和高效的 其并发机制使编写充分利用多核和联网机器的程序变得容易 而其新颖类型系统则可实现灵活的模块化程序构建 快速编译为机器代码 但具有垃圾
  • apple资讯

    6 月 10 日消息 macOS 12 Monterey 支持通过 AirPlay 将内容发送到第二台 Mac 上 用户还可以使用该功能进行屏幕镜像 将一台备用机器变成一个外部显示器 除了使用 AirPlay 无线方式外 macOS 12
  • MATLAB雷达空时自适应处理

    空时自适应处理是一个用来描述同时处理空域和时域的自适应阵列的术语 信号的空域分量由阵列传感器收集 与所有阵列工作相同 而信号的时域分量用每个阵列传感器后等间隔延时单元产生 为此目的 一个尺寸N阵列有N个子通道 每个传感器后面对应一个 在每个
  • Java Servlet生成Json格式数据

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Java Servlet生成Json格式数据 分类 Web JAVA2013 09 17 14 38 4805人阅读 评论 1 收藏 举报 在Servlet中覆写doGet
  • java 提交表单_http常见的form表单请求方式

    在Web开发中 我们使用的比较多的HTTP请求方式基本上就是GET POST 一 http请求常见的表单文件上传形式 首先了解下application x www form urlencoded和multipart form data的区别
  • 渗透测试-木马免杀的几种方式

    前言 免杀 又叫免杀毒技术 是反病毒 反间谍的对立面 是一种能使病毒或木马免于被杀毒软件查杀的软件 它除了使病毒木马免于被查杀外 还可以扩增病毒木马的功能 改变病毒木马的行为 免杀的基本特征是破坏特征 有可能是行为特征 只要破坏了病毒与木马
  • Ubuntu18.04 编译安装llvm-clang

    背景知识 LLVM和GCC的区别 传统编译器 传统编译器的工作原理基本上都是三段式的 可以分为前端 Frontend 优化器 Optimizer 后端 Backend 前端负责解析源代码 检查语法错误 并将其翻译为抽象的语法树 Abstra
  • ASP.NET WebApi + Autofac 实现依赖注入

    一 项目情况 框架 NET Framework 4 5 Autofac 3 5 0 Autofac WebApi2 4 3 0 二 定义接口与对应实现 接口1 public interface IBaseUserService List