背景:

  本人在一位大佬的Colder框架中看到了这个接口注入,然后呢就想学习一下ioc思想与di设计模式。此写法给我的感觉就是

非常的 优雅 ,优雅永不过时。关于接口注入的概念和ioc和di具体是什么?可以参考下方的推荐的地址学习。话不多说,开撸。

安装:

  打开nuget管理工具,将我下面标红色的包都进行安装(注:千万别安装错了,按照名字不差的安装)

  

使用:

  我们新建一个DI的文件夹,在文件夹中增加一个接口:IDependency.cs

  1. namespace Coldairarrow
  2. {
  3. /// <summary>
  4. /// 注入标记
  5. /// </summary>
  6. public interface IDependency
  7. {
  8.  
  9. }
  10. }

    先不要问问什么后面会解释。

    后面:其实。。就是这个依赖注入的一个原理吧。根据这个接口去找依赖的实现。

    推荐去这个地址看一下:https://www.cnblogs.com/atomy/p/12834804.html

    好了,继续分别新建Student.cs,StudentRepository.cs,IStudentRepository.cs三个类。StudentRepository.cs里面的具体业务根据需要自行修改,这里是为了测试使用。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5.  
  6. namespace ByzkApi
  7. {
  8. public class Student
  9. {
  10. public int Id { get; set; }
  11. public string Name { get; set; }
  12. public string Graduation { get; set; }
  13. public string School { get; set; }
  14. public string Major { get; set; }
  15. }
  16. }
  1. using Coldairarrow;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Web;
  6.  
  7. namespace ByzkApi
  8. {
  9. public class StudentRepository : IStudentRepository,IDependency
  10. {
  11. public Student Add(Student item)
  12. {
  13. throw new NotImplementedException();
  14. }
  15.  
  16. public bool Delete(int id)
  17. {
  18. throw new NotImplementedException();
  19. }
  20.  
  21. public Student Get(int id)
  22. {
  23. return new Student() { Name = "张三" };
  24. }
  25.  
  26. public IEnumerable<Student> GetAll()
  27. {
  28. throw new NotImplementedException();
  29. }
  30.  
  31. public bool Update(Student item)
  32. {
  33. throw new NotImplementedException();
  34. }
  35. }
  36. }
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace ByzkApi
  8. {
  9. public interface IStudentRepository
  10. {
  11. IEnumerable<Student> GetAll();
  12. Student Get(int id);
  13. Student Add(Student item);
  14. bool Update(Student item);
  15. bool Delete(int id);
  16.  
  17. }
  18. }

注意:这里好好看一下 StudentRepository 是实现了两个接口分别是 IStudentRepository IDependency(注入标记)

最关键的地方来了,我们打开项目启动的函数Application_Start,然后注入一下接口依赖。

  1. using Autofac;
  2. using Autofac.Extras.DynamicProxy;
  3. using Autofac.Integration.Mvc;
  4. using Autofac.Integration.WebApi;
  5. using ByzkApi.Controllers;
  6. using ByzkApi.Interface;
  7. using Coldairarrow;
  8. using Microsoft.Extensions.DependencyInjection;
  9. using System.Linq;
  10. using System.Reflection;
  11. using System.Web.Compilation;
  12. using System.Web.Http;
  13. using System.Web.Mvc;
  14. using System.Web.Optimization;
  15. using System.Web.Routing;
  16.  
  17. namespace ByzkApi
  18. {
  19. public class WebApiApplication : System.Web.HttpApplication
  20. {
  21. protected void Application_Start()
  22. {
  23. //初始化Autofac
  24. InitAutofac(GlobalConfiguration.Configuration);
  25.  
  26. AreaRegistration.RegisterAllAreas();
  27. GlobalConfiguration.Configure(WebApiConfig.Register);
  28. FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
  29. RouteConfig.RegisterRoutes(RouteTable.Routes);
  30. BundleConfig.RegisterBundles(BundleTable.Bundles);
  31. }
  32.  
  33. private void InitAutofac(HttpConfiguration config)
  34. {
  35. var builder = new ContainerBuilder();
  36.  
  37. var baseType = typeof(IDependency);
  38.  
  39. //可以进行筛选如: Where(x => x.FullName.Contains("Coldairarrow"))
  40. var assemblys = BuildManager.GetReferencedAssemblies().Cast<Assembly>()
  41. .ToList();
  42.  
  43. //自动注入IDependency接口,支持AOP,生命周期为InstancePerDependency
  44. builder.RegisterAssemblyTypes(assemblys.ToArray())
  45. .Where(x => baseType.IsAssignableFrom(x) && x != baseType)
  46. .AsImplementedInterfaces()
  47. .PropertiesAutowired()
  48. .InstancePerDependency()
  49. .EnableInterfaceInterceptors()
  50. .InterceptedBy(typeof(Interceptor));
  51.  
  52. //注册Controller
  53. builder.RegisterControllers(assemblys.ToArray())
  54. .PropertiesAutowired();
  55. builder.RegisterApiControllers(assemblys.ToArray()).PropertiesAutowired();
  56.  
  57. //AOP
  58. builder.RegisterType<Interceptor>();
  59. builder.RegisterWebApiFilterProvider(config);
  60.  
  61. var container = builder.Build();
  62. DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
  63. var resolver = new AutofacWebApiDependencyResolver(container);
  64. GlobalConfiguration.Configuration.DependencyResolver = resolver;
  65. AutofacHelper.Container = container;
  66. }
  67.  
  68. }
  69. }

到此为止就已经注入完成了~

使用:

    这个接口注入好了之后可以在普通的Controller使用,也可以在apiController进行使用,分别看一下效果,结束。

  Controller:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Mvc;
  6.  
  7. namespace ByzkApi.Controllers
  8. {
  9. public class HomeController : Controller
  10. {
  11. readonly IStudentRepository repository;
  12. //构造器注入
  13. public HomeController(IStudentRepository repository)
  14. {
  15. this.repository = repository;
  16. }
  17.  
  18. public ActionResult Index()
  19. {
  20.  
  21. var a = repository.Get(1);
  22.  
  23. ViewBag.Title = a.Name;
  24.  
  25. return View();
  26. }
  27. }
  28. }

  运行结果:

  ApiController:(如果想要多个接口只需要实现接口的时候进行继承IDependency就可)

  

  1. using ByzkApi.Interface;
  2. using Coldairarrow.Web;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Web;
  8. using System.Web.Http;
  9.  
  10. namespace ByzkApi.Controllers
  11. {
  12. public class TestApiController : ApiController
  13. {
  14. readonly IStudentRepository repository;
  15.  
  16. public ITest _test { get; }
  17. //构造器注入
  18. public TestApiController(IStudentRepository repository, ITest test)
  19. {
  20. this.repository = repository;
  21. _test = test;
  22. }
  23.  
  24. [HttpGet]
  25. public DataTable test(string sql)
  26. {
  27. repository.Get(1);
  28. var data = _test.GetTest("sql 语句");
  29. //repository.GetTest(sql);
  30. return data;
  31. }
  32. }
  33. }

  运行效果:

  

C# 利用Autofac批量接口注入依赖【学习记录】的更多相关文章

  1. asp.netcore di 实现批量接口注入

    废话少说,先上代码 public static Dictionary<Type, Type[]> GetImpleAndInterfaces(string assemblyName,str ...

  2. Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)

    QuartzHostedService  是一个用来在Asp.Net Core 中实现 Quartz 的任务注入依赖的nuget 包: 基本示例如下: using System; using Syst ...

  3. ASP.NET Core 2.2 WebApi 系列【三】AutoFac 仓储接口的依赖注入

    一.准备工作 通过程序包管理器控制台安装AutoFac: Install-Package Autofac.Extensions.DependencyInjection 创建新类库(.NetCore 2 ...

  4. 基于SqlSugar的开发框架循序渐进介绍(5)-- 在服务层使用接口注入方式实现IOC控制反转

    在前面随笔,我们介绍过这个基于SqlSugar的开发框架,我们区分Interface.Modal.Service三个目录来放置不同的内容,其中Modal是SqlSugar的映射实体,Interface ...

  5. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探

    更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...

  6. Spring.NET依赖注入框架学习--入门

    Spring.NET依赖注入框架学习--入门 在学些Spring.net框架之前,有必要先脑补一点知识,比如什么是依赖注入?IOC又是什么?控制反转又是什么意思?它们与Spring.net又有什么关系 ...

  7. Z从壹开始前后端分离【 .NET Core2.2/3.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探

    本文梯子 本文3.0版本文章 更新 代码已上传Github+Gitee,文末有地址 零.今天完成的绿色部分 一.依赖注入的理解和思考 二.常见的IoC框架有哪些 1.Autofac+原生 2.三种注入 ...

  8. Asp.NetCore3.1版本的CodeFirst与经典的三层架构与AutoFac批量注入

    Core3.1 CodeFirst与AutoFac批量注入(最下面附GitHub完整 Demo,由于上传网速较慢,这里就直接压缩打包上传了) ===Core3.1 CodeFirst 数据库为远程阿里 ...

  9. Spring.NET依赖注入框架学习--简单对象注入

    Spring.NET依赖注入框架学习--简单对象注入 在前面的俩篇中讲解了依赖注入的概念以及Spring.NET框架的核心模块介绍,今天就要看看怎么来使用Spring.NET实现一个简单的对象注入 常 ...

  10. Spring.NET依赖注入框架学习--简介

    Spring.NET依赖注入框架学习--Spring.NET简介 概述 Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序.它提供了很多方面的功能,比如依赖注入. ...

随机推荐

  1. @SpringBootConfiguration注解

    @SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类, 并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到sprin ...

  2. modbus通信案例简单介绍

    介绍: 1.仪表等其他智能设备的modbus通信协议,确定其内部功能码地址.以型号U-MIK-P350-SCN2的杭州美控公司的压力变送器为例.查看对应手册20页.2.PLC端的编程配置.以西门子s7 ...

  3. 多python版本的库安装和导库

    同时安装多python版本的,使用pip安装python的库,以及导出python库列表及版本,使用导出的库列表批量进行新环境的库安装. 1.同时安装python2和python3时,要进行pip安装 ...

  4. SnakeYaml反序列化分析

    前言 SnakeYaml是Java中解析yaml的库,而yaml是一种人类可读的数据序列化语言,通常用于编写配置文件等.yaml真是到哪都有啊. 环境搭建 <dependency> < ...

  5. 使用ISS服务器方式跑C#程序

    使用ISS服务器方式跑C#程序 VS2010,临时接了一个C#系统的小系统,需要本地调试跑一下 但是老是在conn.open提示06413,简单来说就是连接不上数据库 尝试了很多方法,最后还是决定配置 ...

  6. C#的基于.net framework的Dll模块编程(二) - 编程手把手系列文章

    今天继续这个系列博文的编写.接上次的篇幅,这次介绍关于C#的Dll类库的创建的内容.因为是手把手系列,所以对于需要入门的朋友来说还是挺好的,下面开始咯: 一.新建Dll类库: 这里直接创建例子的Dll ...

  7. 当 Knative 遇见 WebAssembly

    简介: Knative 可以支持各种容器化的运行时环境,我们今天来探索一下利用 WebAssembly 技术作为一个新的 Serverless 运行时. 作者:易立 Knative 是在 Kubern ...

  8. 全面升级!揭秘阿里云智能Logo设计的AI黑科技

    简介: 免费体验!阿里云智能logo设计一直致力于用AI技术,帮助更多有设计需求的朋友能"多快好省"地做logo,让"设计logo"这件有门槛的事情,通过智能工 ...

  9. Flink集成Iceberg在同程艺龙的实践

    ------------恢复内容开始------------ null ------------恢复内容结束------------

  10. [FAQ] Windows 终端 `git diff` 出现 LF 空格 ^M 符号, 处理方式

      可能是终端内的换行配置和 IDE 当中的不一致. 比如 PHPStorm 的: Git 终端使用 git config core.autocrlf 查看是 true 还是 false. 是 tru ...