首页 > 编程语言 >.net 温故知新【13】:Asp.Net Core WebAPI 使用依赖注入DI

.net 温故知新【13】:Asp.Net Core WebAPI 使用依赖注入DI

时间:2023-11-09 11:34:49浏览次数:39  
标签:WebAPI Core DI 温故知新 app 项目 Services builder 注入

一、使用DI注入

在之前的文章中已经讲过DI的概念(.net 温故知新:【7】IOC控制反转,DI依赖注入),基于控制台程序演示了DI依赖注入的使用,基于Microsoft.Extensions.DependencyInjection完成。那在WebAPI中如何使用依赖注入呢?

首先新建一个WebAPI项目WebAPI_DI,框架.net 7,其实 webapi 项目也是控制台应用程序,只是在Asp.Net Core webapi框架中很多基础工作已经帮我们封装配置好了。

项目新建完成后在Program.cs 中自动生成如下代码:

namespace WebAPI_DI
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            app.UseHttpsRedirection();

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
        }
    }
}

builder.Services 则是帮我已经创建好的IServiceCollection 对象。

我们再新建一个测试类 DITestClass:

    public class DITestClass
    {
        public int Add(int i, int n)
        {
            return i + n;
        }
    }

然后我们在builder.Services中进行注册

image

最后我们在默认的WeatherForecastController控制器里面加一个post方法,并用构造函数注入的方式将DITestClass注入进去。

image

swagger中调用测试:

image

二、[FromService] 注入

FromServicesAttribute 允许将服务直接注入到操作方法,而无需使用构造函数注入。
改属性的作用主要针对我们在依赖注入初始化对象(该对象初始化很耗时),这个时候不管请求的api方法有没有用到该对象都会等待很长时间。
所以使用FromService让接口在请求的时候再注入,从而不影响其他接口

image

三、多层架构注入

在多层架构中我们如果引用了其他项目,要使用其他项目中的类,那么要在主项目中进行DI注入,这样相当于所有其他模块或者其他人写的项目都需要主项目来维护注入,比如:

新建一个ClassLibrary1项目,Class1类,方法Sub:

image

我们在web项目里面引用ClassLibrary1项目,如果要使用Class1类就需要在 Programe.cs里面注册

builder.Services.AddScoped(typeof(Class1));

image

那么有没有方法让他们自己的项目自己管理注册呢,我们可以简单改造一下

  • 新建一个类库,定义一个公共接口,安装Microsoft.Extensions.DependencyInjection

image

  • 在ClassLibarary1里面定义实现接口类
    public class ModulInit : IModuleInit
    {
        public void Init(IServiceCollection service)
        {
            //所有需要DI的在此处注入
            service.AddScoped<Class1>();
        }
    }
  • 在Programe.cs里面调用引用项目的注册类

image

这样其他项目也按照这种方式,在主项目中只要调用一次注册管理。不过这是最简单的方式,你也可以使用反射来查找引用的项目继承了IModuleInit的类,然后进行Init方法调用,这样会更优雅一些。
当然你还可以使用其他依赖注入框架来取代Microsoft.Extensions.DependencyInjection,也学这个问题就不再是问题!

标签:WebAPI,Core,DI,温故知新,app,项目,Services,builder,注入
From: https://www.cnblogs.com/SunSpring/p/17816564.html

相关文章

  • Sitecore 扩展CM部署
    相关文档:配置多个Sitecore实例实例结构:有两个Sitecore实例:Instance1和Instance2,分别管理各自的Content,在Publishing的时候调用SharedInstance(共享Sitecore实例)来作对应的Solr索引构建,最后相关的Scheduler也放在SharedInstance里。配置步骤SharedCM需要......
  • 界面组件DevExpress ASP.NET Core v23.1 - 进一步升级UI组件
    DevExpressASP.NETCore Controls使用强大的混合方法,结合现代企业Web开发工具所期望的所有功能。该套件通过ASP.NETRazor标记和服务器端ASP.NETCoreWebAPI的生产力和简便性,提供客户端JavaScript的性能和灵活性。ThemeBuilder工具和集成的MaterialDesign、通用主题集可以让......
  • 搭建一个.NetCore控制台程序框架,包含依赖注入/配置/日志等要素
    前言#最近需要开发小工具的场景有点多,上次我用go语言开发了一个hive导出工具,体验还不错,只是go语言的语法实在是喜欢不起来,这次继续试试用C#来开发小工具。这次小工具的功能很简单,数据库数据迁移,不过这不重要,主要是记录一下更适合.NetCore宝宝体质的控制台小工具开发......
  • .net core webapi Startup services.AddHttpClient
    staticpublicclassCreditScoreServiceExtension{staticpublicvoidAddCreditScoreQueryServiceHttpClient(thisIServiceCollectionservices,IConfigurationconfig){services.AddSingleton<ICreditScoreQueryService,CreditS......
  • NETCore,离线部署Linux ,离线部署 libgdiplus
    背景错误信息:Unabletoloadsharedlibrary‘libgdiplus‘oroneofitsdependencies解析:libgdiplus是Linux支持Netcore的图形库,比如System.Drawing要用,在线安装都容易,离线就处理起来恶心了以下事爬坑记录,思路:在有网的Linux下载依赖包,然后再拷贝rmp包去离线服务器安装参......
  • .netCoreApi5.0+部署iis站点webconfig配置 HTTP 错误 500.24 - Internal Server Error
     <?xmlversion="1.0"encoding="utf-8"?><configuration><locationpath="."inheritInChildApplications="false"><system.webServer><handlers><addname="aspN......
  • Asp.Net Core webapi+net6 使用资源筛选器(过滤器) 做缓存
    写一个特性类,用来做标记[AttributeUsage(AttributeTargets.Method)]//只对方法有效publicclassResourceFilterAttribute:Attribute{}我这里使用了MemoryCache来做缓存,也可以使用字典来做,但一定要加上static,否则字典每一次请求都会new一个实例,缓存的东西就丢了private......
  • Asp.Net Core实战(干货)
    序言使用.NETCore,团队可以更容易专注的在.netcore上工作。比如核心类库(如System.Collections)的更改仍然需要与.NETFramework相同的活力,但是ASP.NETCore或EntityFrameworkCore可以更轻松地进行实质性更改,而不受向后兼容性的限制。.NETCore借鉴了.NETFramework的最佳实践,并......
  • .Net Core AOP之AuthorizeAttribute
    一、简介在.netcore中Filter分为以下六大类:1、AuthorizeAttribute(权限验证)2、IResourceFilter(资源缓存)3、IActionFilter(执行方法前后的记录)4、IResultFilter(结果生成前后扩展)5、IAlwaysRun(响应结果的补充)6、IExceptionFilter(异常处理)二、AuthorizeAttribute(权限验证)......
  • .Net Core之JWT授权
    一、什么是JWT文章参考:https://www.leo96.com/article/detail/55JSONWeb令牌(JWT)是一个开放标准(RFC7519),它定义 了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为JSON对象。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用HMAC算法)或使用RSA或EC......