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应用程序.它提供了很多方面的功能,比如依赖注入. ...
随机推荐
- win10更新后使用ie浏览器自动跳转edge的解决方法
win10更新后使用ie浏览器自动跳转edge的解决方法 ①在系统的搜索框中搜索internet选项 ②打开界面中,选择高级的栏位 ③然后在红框的地方找到启用第三方浏览器扩展,去掉勾选 ④应用,确定, ...
- 力扣141(Java)-环形链表(简单)
题目: 给你一个链表的头节点 head ,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,评测系统内部使用整数 pos ...
- 力扣578(MySQL)-查询回答率最高的问题(中等)
题目: 从 survey_log 表中获得回答率最高的问题,survey_log 表包含这些列:id, action, question_id, answer_id, q_num, timestamp ...
- 力扣41(java)-缺失的第一个正数(困难)
题目: 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数. 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案. 示例 1: 输入:nums = [1,2,0 ...
- 力扣372(java)-超级次方(中等)
题目: 你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出. 示例 1: 输入:a = 2, b = [3]输出:8示例 2: 输入:a = 2, ...
- 基于EasyCV复现ViTDet:单层特征超越FPN
简介: ViTDet其实是恺明团队MAE和ViT-based Mask R-CNN两个工作的延续.MAE提出了ViT的无监督训练方法,而ViT-based Mask R-CNN给出了用ViT作为bac ...
- [Go] golang 执行 Linux 系统 command
执行系统 shell 命令示例: fileDir := "files/"out, err := exec.Command("sh", "-c" ...
- [FAQ] Solidity 合约销毁 ?
仅创建者可以销毁合约的示例: address public owner; // When deploy contract constructor() public { owner = msg.send ...
- Region-区域(默认和新增)适配器
Prism内置了几个区域适配器 ContentControlRegionAdapter ItemsControlRegionAdapter SelectorRegionAdapter ComboBox ...
- WPF 应用启动过程同时启动多个 UI 线程且访问 ContentPresenter 可能让多个 UI 线程互等
在应用启动过程里,除了主 UI 线程之外,如果还多启动了新的 UI 线程,且此新的 UI 线程碰到 ContentPresenter 类型,那么将可能存在让新的 UI 线程和主 UI 线程互等.这是多 ...