背景:

  本人在一位大佬的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批量接口注入依赖【学习记录】的更多相关文章

  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. Webpack Proxy工作原理?为什么能解决跨域?

    一.是什么 webpack proxy,即webpack提供的代理服务 基本行为就是接收客户端发送的请求后转发给其他服务器 其目的是为了便于开发者在开发模式下解决跨域问题(浏览器安全策略限制) 想要实 ...

  2. 文本溢出显示省略号css

    项目中常常有这种需要我们对溢出文本进行"..."显示的操作,单行多行的情况都有(具体几行得看设计师心情了),这篇随笔是我个人对这种情况解决办法的归纳,欢迎各路英雄指教. 单行 语法 ...

  3. Jenkins实战系列(一)——Jenkins简介

    Jenkins是一个开源的自动化构建工具,可以帮助开发人员自动构建.测试和部署软件.它支持多种编程语言.版本控制系统和构建工具,如Java.Git.Maven等.Jenkins的核心功能是通过一系列插 ...

  4. OpenKruise v1.3:新增自定义 Pod Probe 探针能力与大规模集群性能显著提升

    简介: 在版本 v1.3 中,OpenKruise 提供了新的 CRD 资源 PodProbeMarker,改善了大规模集群的一些性能问题,Advanced DaemonSet 支持镜像预热,以及 C ...

  5. 阿里云2020上云采购季,你的ECS买好了吗?

    阿里云2020上云采购季,超级品类日,天天有爆款. 今日爆款推荐:云服务器. 重磅推荐两款,限时抢购. 新品共享型s6: 企业级共享型n4: 想看更多云产品,来阿里云采购季: https://www. ...

  6. 性能提升 57% ,SMC-R 透明加速 TCP 实战解析 | 龙蜥技术

    ​简介:SMC-R 是如何加速 TCP 应用? 编者按:TCP 协议作为当前使用最为广泛的网络协议,场景遍布移动通信.数据中心等.对于数据中心场景,通过弹性 RDMA 实现高性能网络协议 SMC-R, ...

  7. 宜搭小技巧|维护Excel太麻烦?Excel一键转应用,为你的工作减负!

    ​简介:只需6步,轻松学会「Excel一键创建应用」! 在钉钉的聊天窗口中,每天都会流转数量巨大的Excel表格,用于信息收集和数据统计,但有时这些表格并不能很好地帮助到我们的工作,相反还会带来许多不 ...

  8. 【产品动态】解读Dataphin流批一体的实时研发

    ​简介: Dataphin作为一款企业级智能数据构建与管理产品,具备全链路实时研发能力,从2019年开始就支撑可集团天猫双11的实时计算需求,文章将详细介绍Dataphin实时计算的能力. 背景 每当 ...

  9. 基于 MaxCompute + Hologres 的人群圈选和数据服务实践

    ​简介: 本文主要介绍如何通过 MaxCompute 进行海量人群的标签加工,通过 Hologres 进行分析建模,从而支持大规模人群复杂圈选场景下的交互式体验,以及基于API的数据服务最佳实践. 本 ...

  10. [ELK] 生产环境中 Elasticsearch 的重要配置项

    配置 Elasticsearch https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html 重要的 E ...