C# 利用Autofac批量接口注入依赖【学习记录】
背景:
本人在一位大佬的Colder框架中看到了这个接口注入,然后呢就想学习一下ioc思想与di设计模式。此写法给我的感觉就是
非常的 优雅 ,优雅永不过时。关于接口注入的概念和ioc和di具体是什么?可以参考下方的推荐的地址学习。话不多说,开撸。
安装:
打开nuget管理工具,将我下面标红色的包都进行安装(注:千万别安装错了,按照名字不差的安装)
使用:
我们新建一个DI的文件夹,在文件夹中增加一个接口:IDependency.cs
- namespace Coldairarrow
- {
- /// <summary>
- /// 注入标记
- /// </summary>
- public interface IDependency
- {
- }
- }
先不要问问什么后面会解释。
后面:其实。。就是这个依赖注入的一个原理吧。根据这个接口去找依赖的实现。
推荐去这个地址看一下:https://www.cnblogs.com/atomy/p/12834804.html
好了,继续分别新建Student.cs,StudentRepository.cs,IStudentRepository.cs三个类。StudentRepository.cs里面的具体业务根据需要自行修改,这里是为了测试使用。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- namespace ByzkApi
- {
- public class Student
- {
- public int Id { get; set; }
- public string Name { get; set; }
- public string Graduation { get; set; }
- public string School { get; set; }
- public string Major { get; set; }
- }
- }
- using Coldairarrow;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- namespace ByzkApi
- {
- public class StudentRepository : IStudentRepository,IDependency
- {
- public Student Add(Student item)
- {
- throw new NotImplementedException();
- }
- public bool Delete(int id)
- {
- throw new NotImplementedException();
- }
- public Student Get(int id)
- {
- return new Student() { Name = "张三" };
- }
- public IEnumerable<Student> GetAll()
- {
- throw new NotImplementedException();
- }
- public bool Update(Student item)
- {
- throw new NotImplementedException();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace ByzkApi
- {
- public interface IStudentRepository
- {
- IEnumerable<Student> GetAll();
- Student Get(int id);
- Student Add(Student item);
- bool Update(Student item);
- bool Delete(int id);
- }
- }
注意:这里好好看一下 StudentRepository 是实现了两个接口分别是 IStudentRepository IDependency(注入标记)
最关键的地方来了,我们打开项目启动的函数Application_Start,然后注入一下接口依赖。
- using Autofac;
- using Autofac.Extras.DynamicProxy;
- using Autofac.Integration.Mvc;
- using Autofac.Integration.WebApi;
- using ByzkApi.Controllers;
- using ByzkApi.Interface;
- using Coldairarrow;
- using Microsoft.Extensions.DependencyInjection;
- using System.Linq;
- using System.Reflection;
- using System.Web.Compilation;
- using System.Web.Http;
- using System.Web.Mvc;
- using System.Web.Optimization;
- using System.Web.Routing;
- namespace ByzkApi
- {
- public class WebApiApplication : System.Web.HttpApplication
- {
- protected void Application_Start()
- {
- //初始化Autofac
- InitAutofac(GlobalConfiguration.Configuration);
- AreaRegistration.RegisterAllAreas();
- GlobalConfiguration.Configure(WebApiConfig.Register);
- FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
- RouteConfig.RegisterRoutes(RouteTable.Routes);
- BundleConfig.RegisterBundles(BundleTable.Bundles);
- }
- private void InitAutofac(HttpConfiguration config)
- {
- var builder = new ContainerBuilder();
- var baseType = typeof(IDependency);
- //可以进行筛选如: Where(x => x.FullName.Contains("Coldairarrow"))
- var assemblys = BuildManager.GetReferencedAssemblies().Cast<Assembly>()
- .ToList();
- //自动注入IDependency接口,支持AOP,生命周期为InstancePerDependency
- builder.RegisterAssemblyTypes(assemblys.ToArray())
- .Where(x => baseType.IsAssignableFrom(x) && x != baseType)
- .AsImplementedInterfaces()
- .PropertiesAutowired()
- .InstancePerDependency()
- .EnableInterfaceInterceptors()
- .InterceptedBy(typeof(Interceptor));
- //注册Controller
- builder.RegisterControllers(assemblys.ToArray())
- .PropertiesAutowired();
- builder.RegisterApiControllers(assemblys.ToArray()).PropertiesAutowired();
- //AOP
- builder.RegisterType<Interceptor>();
- builder.RegisterWebApiFilterProvider(config);
- var container = builder.Build();
- DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
- var resolver = new AutofacWebApiDependencyResolver(container);
- GlobalConfiguration.Configuration.DependencyResolver = resolver;
- AutofacHelper.Container = container;
- }
- }
- }
到此为止就已经注入完成了~
使用:
这个接口注入好了之后可以在普通的Controller使用,也可以在apiController进行使用,分别看一下效果,结束。
Controller:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- namespace ByzkApi.Controllers
- {
- public class HomeController : Controller
- {
- readonly IStudentRepository repository;
- //构造器注入
- public HomeController(IStudentRepository repository)
- {
- this.repository = repository;
- }
- public ActionResult Index()
- {
- var a = repository.Get(1);
- ViewBag.Title = a.Name;
- return View();
- }
- }
- }
运行结果:
ApiController:(如果想要多个接口只需要实现接口的时候进行继承IDependency就可)
- using ByzkApi.Interface;
- using Coldairarrow.Web;
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.Linq;
- using System.Web;
- using System.Web.Http;
- namespace ByzkApi.Controllers
- {
- public class TestApiController : ApiController
- {
- readonly IStudentRepository repository;
- public ITest _test { get; }
- //构造器注入
- public TestApiController(IStudentRepository repository, ITest test)
- {
- this.repository = repository;
- _test = test;
- }
- [HttpGet]
- public DataTable test(string sql)
- {
- repository.Get(1);
- var data = _test.GetTest("sql 语句");
- //repository.GetTest(sql);
- return data;
- }
- }
- }
运行效果:
C# 利用Autofac批量接口注入依赖【学习记录】的更多相关文章
- asp.netcore di 实现批量接口注入
废话少说,先上代码 public static Dictionary<Type, Type[]> GetImpleAndInterfaces(string assemblyName,str ...
- Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)
QuartzHostedService 是一个用来在Asp.Net Core 中实现 Quartz 的任务注入依赖的nuget 包: 基本示例如下: using System; using Syst ...
- ASP.NET Core 2.2 WebApi 系列【三】AutoFac 仓储接口的依赖注入
一.准备工作 通过程序包管理器控制台安装AutoFac: Install-Package Autofac.Extensions.DependencyInjection 创建新类库(.NetCore 2 ...
- 基于SqlSugar的开发框架循序渐进介绍(5)-- 在服务层使用接口注入方式实现IOC控制反转
在前面随笔,我们介绍过这个基于SqlSugar的开发框架,我们区分Interface.Modal.Service三个目录来放置不同的内容,其中Modal是SqlSugar的映射实体,Interface ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探
更新 1.如果看不懂本文,或者比较困难,先别着急问问题,我单写了一个关于依赖注入的小Demo,可以下载看看,多思考思考注入的原理: https://github.com/anjoy8/BlogArti ...
- Spring.NET依赖注入框架学习--入门
Spring.NET依赖注入框架学习--入门 在学些Spring.net框架之前,有必要先脑补一点知识,比如什么是依赖注入?IOC又是什么?控制反转又是什么意思?它们与Spring.net又有什么关系 ...
- Z从壹开始前后端分离【 .NET Core2.2/3.0 +Vue2.0 】框架之九 || 依赖注入IoC学习 + AOP界面编程初探
本文梯子 本文3.0版本文章 更新 代码已上传Github+Gitee,文末有地址 零.今天完成的绿色部分 一.依赖注入的理解和思考 二.常见的IoC框架有哪些 1.Autofac+原生 2.三种注入 ...
- Asp.NetCore3.1版本的CodeFirst与经典的三层架构与AutoFac批量注入
Core3.1 CodeFirst与AutoFac批量注入(最下面附GitHub完整 Demo,由于上传网速较慢,这里就直接压缩打包上传了) ===Core3.1 CodeFirst 数据库为远程阿里 ...
- Spring.NET依赖注入框架学习--简单对象注入
Spring.NET依赖注入框架学习--简单对象注入 在前面的俩篇中讲解了依赖注入的概念以及Spring.NET框架的核心模块介绍,今天就要看看怎么来使用Spring.NET实现一个简单的对象注入 常 ...
- Spring.NET依赖注入框架学习--简介
Spring.NET依赖注入框架学习--Spring.NET简介 概述 Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序.它提供了很多方面的功能,比如依赖注入. ...
随机推荐
- @SpringBootConfiguration注解
@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类, 并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到sprin ...
- modbus通信案例简单介绍
介绍: 1.仪表等其他智能设备的modbus通信协议,确定其内部功能码地址.以型号U-MIK-P350-SCN2的杭州美控公司的压力变送器为例.查看对应手册20页.2.PLC端的编程配置.以西门子s7 ...
- 多python版本的库安装和导库
同时安装多python版本的,使用pip安装python的库,以及导出python库列表及版本,使用导出的库列表批量进行新环境的库安装. 1.同时安装python2和python3时,要进行pip安装 ...
- SnakeYaml反序列化分析
前言 SnakeYaml是Java中解析yaml的库,而yaml是一种人类可读的数据序列化语言,通常用于编写配置文件等.yaml真是到哪都有啊. 环境搭建 <dependency> < ...
- 使用ISS服务器方式跑C#程序
使用ISS服务器方式跑C#程序 VS2010,临时接了一个C#系统的小系统,需要本地调试跑一下 但是老是在conn.open提示06413,简单来说就是连接不上数据库 尝试了很多方法,最后还是决定配置 ...
- C#的基于.net framework的Dll模块编程(二) - 编程手把手系列文章
今天继续这个系列博文的编写.接上次的篇幅,这次介绍关于C#的Dll类库的创建的内容.因为是手把手系列,所以对于需要入门的朋友来说还是挺好的,下面开始咯: 一.新建Dll类库: 这里直接创建例子的Dll ...
- 当 Knative 遇见 WebAssembly
简介: Knative 可以支持各种容器化的运行时环境,我们今天来探索一下利用 WebAssembly 技术作为一个新的 Serverless 运行时. 作者:易立 Knative 是在 Kubern ...
- 全面升级!揭秘阿里云智能Logo设计的AI黑科技
简介: 免费体验!阿里云智能logo设计一直致力于用AI技术,帮助更多有设计需求的朋友能"多快好省"地做logo,让"设计logo"这件有门槛的事情,通过智能工 ...
- Flink集成Iceberg在同程艺龙的实践
------------恢复内容开始------------ null ------------恢复内容结束------------
- [FAQ] Windows 终端 `git diff` 出现 LF 空格 ^M 符号, 处理方式
可能是终端内的换行配置和 IDE 当中的不一致. 比如 PHPStorm 的: Git 终端使用 git config core.autocrlf 查看是 true 还是 false. 是 tru ...