前言

周末加班,下午犯困,整理下之前鼓捣过的东西,看过我之前的webapi系列的读者知道,我之前试过Aspect,但是升级到3.0之后没往下去试了,当时还留了个坑,这不,现在果断移除了换成这个了。

Autofac

这个第三方类库呢,是Ioc的容器,可以简化我们很大的工作量,比如说在之前我们需要写个类去声明接口与实现,而用了这个容器呢,就不需要了,当然还是需要些配置的。

首先,引入第三方类库,不多说。

然后开始配置吧,首先先来看Program,添加AutofacServiceProviderFactory

        public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseServiceProviderFactory(new AutofacServiceProviderFactory());

改完之后呢,我们果断就来到了Startup,只要是配置,当然要看入口文件跟这个配置文件了。

3.x呢有个变化就是Autofac要通过ConfigureContainer这个传入容器的方法来配置了,不需要自己再创建。

        private static readonly List<string> _Assemblies = new List<string>()
{
"April.Service"
};
public void ConfigureContainer(ContainerBuilder container)
{
var assemblys = _Assemblies.Select(x => Assembly.Load(x)).ToList();
List<Type> allTypes = new List<Type>();
assemblys.ForEach(aAssembly =>
{
allTypes.AddRange(aAssembly.GetTypes());
}); // 通过Autofac自动完成依赖注入
container.RegisterTypes(allTypes.ToArray())
.AsImplementedInterfaces()
.PropertiesAutowired()
.InstancePerDependency(); // 注册Controller
container.RegisterAssemblyTypes(typeof(Startup).GetTypeInfo().Assembly)
.Where(t => typeof(Controller).IsAssignableFrom(t) && t.Name.EndsWith("Controller", StringComparison.Ordinal))
.PropertiesAutowired();
}

通过RegisterTypes的注册方法将对应工程,也就是April.Service下的类接口与实现自动绑定,当然你也可以通过注册接口的方法一个个来,但是我懒,比如:

// 一个
builder.RegisterType<StudentService>().As<IStudentService>();
// 一对多
builder.RegisterType<StudentService>().As<IStudentService>().As<ITestService>();

这里注意,声明绑定一般是一对一,当然也可以是一对多,如果多次注册声明一个类,会取最后一次注册的声明作为实际操作的类。

好了,配置完成之后,我们来试下效果吧(当然我是已经注释掉之前的ServiceInjection这个声明方法了)。

在我们访问Values的时候,我们看下IStudentService是否是null。

OK,这已经说明通过Autofac这个容器,已经完成了一个工程里面的接口与实现的依赖关系了。

添加一个Util来随时调用

在接触的朋友中,有人给我反馈个信息,我不想每次写方法都要构造函数来传接口方法给我,也就是说我不要你觉得,我要我觉得。

好啊,你觉得方法自己要啥拿啥,可以,来个Util吧。

    public class AutofacUtil
{
public static ILifetimeScope Container { get; set; } /// <summary>
/// 获取服务(Single)
/// </summary>
/// <typeparam name="T">接口类型</typeparam>
/// <returns></returns>
public static T GetService<T>() where T : class
{
return Container.Resolve<T>();
} /// <summary>
/// 获取服务(请求生命周期内)
/// </summary>
/// <typeparam name="T">接口类型</typeparam>
/// <returns></returns>
public static T GetScopeService<T>() where T : class
{
return (T)GetService<IHttpContextAccessor>().HttpContext.RequestServices.GetService(typeof(T));
}
}

在用之前,我们需要针对Container来个声明实例化,Startup中的Configure添加下面一句。

            AutofacUtil.Container = app.ApplicationServices.GetAutofacRoot();

修改Values中的一部分来通过实例化的方式来调用接口。

            IStudentService studentService = AutofacUtil.GetScopeService<IStudentService>();

            StudentEntity entity = new StudentEntity
{
//新增
Name = "小明",
Age = 18,
Number = "007",
Sex = 0,
Address = "大洛阳"
}; studentService.Insert(entity);

让我们来看下效果吧。

两种方法,看个人习惯吧,我是推荐通过注入的方式,通过构造函数的方式来获取接口实现。

小结

简单记录平时鼓捣的点点滴滴,有时候真是觉得,还是要多看多鼓捣,就像这个容器,在之前我通过一行一行的接口+实现来做绑定声明,现在呢,只需要改造下,就可以一键无脑实例化,第三方库的使用与否,个人觉得还是能踩着巨人的肩膀哪怕靠着也可以,自己一步步爬固然可嘉,也要学会变通,这样方能提高效率,路漫漫其修远兮

代码地址

注意切换到3.0的分支。

github

gitee

预告

April-Admin,总算是要有个前后端联动的工程了,一个名副其实的基础工程。

前端基于Ant Design Pro

后端当然是net core 3.1

net core WebApi——依赖注入Autofac的更多相关文章

  1. 【半小时大话.net依赖注入】(下)详解AutoFac+实战Mvc、Api以及.NET Core的依赖注入

    系列目录 上|理论基础+实战控制台程序实现AutoFac注入 下|详解AutoFac+实战Mvc.Api以及.NET Core的依赖注入 前言 本来计划是五篇文章的,每章发个半小时随便翻翻就能懂,但是 ...

  2. .net core 依赖注入, autofac 简单使用

    综述 ASP.NET Core  支持依赖注入, 也推荐使用依赖注入. 主要作用是用来降低代码之间的耦合度. 什么是控制反转? 控制反转(Inversion of Control,缩写为IoC),是面 ...

  3. 几十行代码实现ASP.NET Core自动依赖注入

    在开发.NET Core web服务的时候,我们习惯使用自带的依赖注入容器来进行注入. 于是就会经常进行一个很频繁的的重复动作:定义一个接口->写实现类->注入 有时候会忘了写Add这一步 ...

  4. ASP.NET Core之依赖注入

    本文翻译自:http://www.tutorialsteacher.com/core/dependency-injection-in-aspnet-core ASP.NET Core支持依赖注入,依赖 ...

  5. 重新整理 .net core 实践篇————依赖注入应用[二]

    前言 这里介绍一下.net core的依赖注入框架,其中其代码原理在我的另一个整理<<重新整理 1400篇>>中已经写了,故而专门整理应用这一块. 以下只是个人整理,如有问题, ...

  6. AutoFac实现WebAPI依赖注入(EF以及Mysql)

    什么是依赖注入? 我们以实际的例子来加以介绍 实体如下 public class Product { public int ID { get; set; } public string Name { ...

  7. .NET Core 中依赖注入框架详解 Autofac

    本文将通过演示一个Console应用程序和一个ASP.NET Core Web应用程序来说明依赖注入框架Autofac是如何使用的 Autofac相比.NET Core原生的注入方式提供了强大的功能, ...

  8. 【框架学习与探究之依赖注入--Autofac】

    声明 本文欢迎转载,原文地址:http://www.cnblogs.com/DjlNet/p/7603642.html 序 同样的又是一个双11如期而至,淘宝/天猫实时数据显示,开场3分钟总交易额突破 ...

  9. .Net Core中依赖注入服务使用总结

    一.依赖注入 引入依赖注入的目的是为了解耦和.说白了就是面向接口编程,通过调用接口的方法,而不直接实例化对象去调用.这样做的好处就是如果添加了另一个种实现类,不需要修改之前代码,只需要修改注入的地方将 ...

随机推荐

  1. 字符串分割+二维数组 Day15练习

    package com.sxt.arrays.test; import java.util.Arrays; /* 1,2,3,4!5,6,7!8,9!12,456,90!32 * 将此字符串以叹号为分 ...

  2. Tyvj 1864 [Poetize I]守卫者的挑战

    P1864 [Poetize I]守卫者的挑战时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻 ...

  3. hdu 1286 找新朋友 (容斥原理 || 欧拉函数)

    Problem - 1286 用容斥原理做的代码: #include <cstdio> #include <iostream> #include <algorithm&g ...

  4. ubuntu netstat 查看端口占用情况

    netstat 用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships ...

  5. 一个框架看懂优化算法之异同 SGD/AdaGrad/Adam

    Adam那么棒,为什么还对SGD念念不忘 (1) —— 一个框架看懂优化算法 机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着 ...

  6. Beta版是什么意思

    外部测试版的意思. 软件会出现三种版本 1.alpha内部测试版本,极不稳定,一般也不会出现的公众视线,仅供内部测试人员测试用. 2.beta公共测试版,就是对外发布软件的测试版,收集公众的意见和建议 ...

  7. python NameError: name 'raw_input' is not defined

    错误:NameError: name 'raw_input' is not defined 原因出在raw_input ,python3.0版本后用input替换了raw_input 话说回来,学习p ...

  8. [转]在ASP.NET WebAPI 中使用缓存【Redis】

    初步看了下CacheCow与OutputCache,感觉还是CacheOutput比较符合自己的要求,使用也很简单 PM>Install-Package Strathweb.CacheOutpu ...

  9. Python--day34--socket模块的方法

    官方文档对socket模块下的socket.send()和socket.sendall()的解释如下: sk.setblocking(False)方法 import socket sk = socke ...

  10. HDU 1828“Picture”(线段树+扫描线求矩形周长并)

    传送门 •参考资料 [1]:算法总结:[线段树+扫描线]&矩形覆盖求面积/周长问题(HDU 1542/HDU 1828) •题意 给你 n 个矩形,求矩形并的周长: •题解1(两次扫描线) 周 ...