iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >ASP.NET Core MVC如何创建控制器与依赖注入
  • 888
分享到

ASP.NET Core MVC如何创建控制器与依赖注入

2023-06-29 06:06:57 888人浏览 安东尼
摘要

这篇文章主要介绍“asp.net Core mvc如何创建控制器与依赖注入”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ASP.net Core MVC如何创

这篇文章主要介绍“asp.net Core mvc如何创建控制器与依赖注入”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ASP.net Core MVC如何创建控制器与依赖注入”文章能帮助大家解决问题。

默认的IControllerActivator

ASP.net core 中,当 MVC 中间件接收到请求时,通过路由选择要执行的控制器和操作方法。为了实际的执行操作, MVC 中间件必须创建所选控制器的实例。

创建控制器的过程依赖众多不同的提供者和工厂类,但最终是由实现IControllerActivator接口的实例来决定的。实现类只需要实现两个方法:

public interface IControllerActivator  {    object Create(ControllerContext context);    void Release(ControllerContext context, object controller);}

如您所见,该IControllerActivator.Create方法传递了用于创建控制器的ControllerContext实例。控制器的创建方式取决于具体的实现。

众所周知,ASP.net core 使用的是DefaultControllerActivator,它通过TypeActivatorCache来创建控制器。TypeActivatorCache通过调用类的构造函数,并试图从 DI 容器中解析构造函数所需参数的实例。

有一点很重要,DefaultControllerActivator 不会试图从 DI 容器中解析控制器的实例,只会解析控制器的依赖项。

DefaultControllerActivator 示例

为了演示这个行为,我创建了一个简单的 MVC 应用程序,包括一个单一的服务和一个控制器。服务实例有一个name属性,它通过构造函数来设置。默认情况下,它使用"default"作为默认值。

public class TestService  {    public TestService(string name = "default")    {        Name = name;    }    public string Name { get; }}

在应用程序中HomeController依赖于TestService,并返回Name属性的值:

public class HomeController : Controller  {    private readonly TestService _testService;    public HomeController(TestService testService)    {        _testService = testService;    }    public string Index()    {        return "TestService.Name: " + _testService.Name;    }}

还有一块代码在Startup文件中。在这里我将TestService注册在 DI 容器中作为范围内服务,并设置 MVC 中间件和服务:

public class Startup  {    public void ConfigureServices(IServiceCollection services)    {        services.AddMvc();        services.AddScoped<TestService>();        services.AddTransient(ctx =>            new HomeController(new TestService("Non-default value")));    }    public void Configure(IApplicationBuilder app)    {        app.UseMvcWithDefaultRoute();    }}

您会注意到,我定义了一个工厂方法用于创建HomeController的实例。将HomeController类型注册到 DI 容器中,并且在TestService实例中传递自定义Name属性。

如果您运行应用程序,您会看到什么结果?

ASP.NET Core MVC如何创建控制器与依赖注入

您可以看到,该TestService.Name属性使用的是默认值,表示TestService实例是直接从 DI 容器中获取的,直接忽略了创建HomeController的工厂方法。

这很容易理解,当您通过DefaultControllerActivator创建控制器时,它不会从DI容器中创建HomeController实例,只会解析构造函数的依赖项。

大多数情况下,使用DefaultControllerActivator是一个不错的选择,但有时您可能希望直接通过 DI 容器来创建控制器,比如您希望使用具有拦截器或装饰器等功能的第三方容器。

幸运的是,MVC 框架包含了一个这样的IControllerActivator实现,并提供了一种非常方便的扩展方法来启用它。

ServiceBasedControllerActivator

如您所见,DefaultControllerActivator使用TypeActivatorCache来创建控制器,MVC还包括另一个实现,称为 ServiceBasedControllerActivator,它是直接从 DI 容器中获取控制器。它的实现非常简单:

public class ServiceBasedControllerActivator : IControllerActivator  {    public object Create(ControllerContext actionContext)    {        var controllerType = actionContext.ActionDescriptor.ControllerTypeInfo.AsType();        return actionContext.HttpContext.RequestServices.GetRequiredService(controllerType);    }    public virtual void Release(ControllerContext context, object controller)    {    }}

当您将 MVC 服务添加到应用程序时,可以使用AddControllersAsServices()扩展方法配置基于 DI 的激活器:

public class Startup  {    public void ConfigureServices(IServiceCollection services)    {        services.AddMvc()                .AddControllersAsServices();        services.AddScoped<TestService>();        services.AddTransient(ctx =>            new HomeController(new TestService("Non-default value")));    }    public void Configure(IApplicationBuilder app)    {        app.UseMvcWithDefaultRoute();    }}

通过上面的代码,点击主页将通过 DI 容器来创建一个控制器。由于我们已经注册了一个创建HomeController的工厂方法,我们自定义TestService配置将被保留,使用替换后的Name属性:

ASP.NET Core MVC如何创建控制器与依赖注入

AddControllersAsServices方法实现了两件事情 - 它将您应用程序中的所有控制器注册到 DI 容器(如果尚未注册),并将IControllerActivator注册为ServiceBasedControllerActivator

public static IMvcBuilder AddControllersAsServices(this IMvcBuilder builder)  {    var feature = new ControllerFeature();    builder.PartManager.PopulateFeature(feature);    foreach (var controller in feature.Controllers.Select(c => c.AsType()))    {        builder.Services.TryAddTransient(controller, controller);    }    builder.Services.Replace(ServiceDescriptor.Transient<IControllerActivator, ServiceBasedControllerActivator>());    return builder;}

如果需要做一些更复杂的事情,您可以随时实现自己IControllerActivator;不过我找不到任何理由,这两点实现还不能满足您的需求!

关于“ASP.NET Core MVC如何创建控制器与依赖注入”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: ASP.NET Core MVC如何创建控制器与依赖注入

本文链接: https://www.lsjlt.com/news/323070.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ASP.NET Core MVC如何创建控制器与依赖注入
    这篇文章主要介绍“ASP.NET Core MVC如何创建控制器与依赖注入”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ASP.NET Core MVC如何创...
    99+
    2023-06-29
  • ASP.NET Core MVC创建控制器与依赖注入讲解
    默认的IControllerActivator 在 ASP.NET Core 中,当 MVC 中间件接收到请求时,通过路由选择要执行的控制器和操作方法。为了实际的执行操作, MVC ...
    99+
    2024-04-02
  • ASP.NET Core MVC控制器请求依赖注入
    ASP.NET Core MVC 控制器应通过构造函数明确地请求它们地依赖关系,在某些情况下,单个控制器地操作可能需要一个服务,在控制器级别上的请求可能没有意义。在这种情况下,也可以...
    99+
    2024-04-02
  • ASP.NET Core MVC 依赖注入View与Controller
    目录一、ASP.NET Core MVC 之依赖注入 View 1.填充查找数据2.重写服务二、 ASP.NET Core MVC 之依赖注入 Controller1.构造...
    99+
    2024-04-02
  • ASP.NET MVC如何实现依赖注入
    这篇文章主要介绍了ASP.NET MVC如何实现依赖注入,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言在java的spring中有自动注入功能,使得代码变得更加简洁灵活,...
    99+
    2023-06-28
  • ASP.NET Core依赖注入DI容器怎么实现
    这篇文章主要介绍“ASP.NET Core依赖注入DI容器怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ASP.NET Core依赖注入DI容器怎么实现”文章能帮助大家解...
    99+
    2023-07-05
  • ASP.NET MVC 3如何让依赖注入实现得更简单
    本篇文章为大家展示了ASP.NET MVC 3如何让依赖注入实现得更简单,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。我没有找到一个完整的示例,只有一些代码片断,于是,我将其整理了一翻,也有一点点个...
    99+
    2023-06-17
  • Sprin如何控制反转和依赖注入
    本篇内容主要讲解“Sprin如何控制反转和依赖注入”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Sprin如何控制反转和依赖注入”吧!控制反转的类型控制反转(IOC)旨在提供一种更简单的机制,来...
    99+
    2023-06-29
  • 如何使用 Golang 创建单元测试依赖注入
    php小编柚子为您带来了一篇关于如何使用Golang创建单元测试依赖注入的文章。在软件开发中,单元测试是至关重要的一部分,而依赖注入则是一种常用的设计模式,可以帮助我们更好地进行单元测...
    99+
    2024-02-11
  • ASP.NET MVC 3中如何理解控制器与视图
    本篇文章给大家分享的是有关ASP.NET MVC 3中如何理解控制器与视图,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。I:控制器和视图的基础概念控制器的概念控制器在ASP.N...
    99+
    2023-06-17
  • C++设计模式中控制反转与依赖注入浅析
    目录控制反转依赖注入(DI)依赖注入框架(DI Framework)依赖反转原则(DIP)控制反转 “控制”指的是对程序执行流程的控制,而“反转&...
    99+
    2023-01-13
    C++控制反转与依赖注入 C++控制反转 C++依赖注入
  • Laravel容器、控制反转和依赖注入实例分析
    这篇文章主要介绍“Laravel容器、控制反转和依赖注入实例分析”,在日常操作中,相信很多人在Laravel容器、控制反转和依赖注入实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Laravel容器、控...
    99+
    2023-06-29
  • 如何创建 PHP 函数库并使其支持依赖项注入?
    如何创建支持依赖项注入(di)的 php 函数库:创建 composer 包作为函数库。实现函数库功能,如在文件中实现一个问候函数。安装 phpdi 容器并创建容器配置,将函数库类作为工...
    99+
    2024-04-26
    php 依赖项注入 mysql composer
  • .NET Core使用Autofac容器的DI依赖注入,IOC控制反转及AOP切面编程
    目录Autofac 容器Autofac 多种注入方式Autofac 生命周期Autofac 支持配置文件Autofac 整合 .NET 5 MVCAutofac 支持控制器属性注入A...
    99+
    2024-04-02
  • 深入浅出讲解Spring框架中依赖注入与控制反转及应用
    目录概念:使用对比1. 使用前:2. 使用后:理解控制反转(Ioc):IoC的应用方法 概念:      依赖注入(Dependency In...
    99+
    2024-04-02
  • Laravel中如何创建控制器
    这篇文章给大家分享的是有关Laravel中如何创建控制器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。为了替代在路由文件中以闭包形式定义的所有的请求处理逻辑,如果想要使用控制类来组织这些行为,控制器能将相关的请求...
    99+
    2023-06-21
  • PHP中如何利用Laravel容器实现依赖注入?
    在软件开发中,依赖注入是一种非常重要的设计模式。它可以让我们更好地管理代码,减少代码的耦合度,提高代码的可维护性和可测试性。在PHP开发中,Laravel框架提供了强大的容器(Container)功能,可以很方便地实现依赖注入。本文将介绍...
    99+
    2023-09-16
    load laravel 容器
  • ASP 容器如何帮助 Laravel 应用实现依赖注入?
    Laravel 是一款广受欢迎的 PHP Web 框架,它提供了很多便捷的功能,其中之一就是依赖注入。依赖注入是一种设计模式,它可以帮助我们管理和解决类之间的依赖关系。在 Laravel 中,我们可以使用 ASP 容器来实现依赖注入。 A...
    99+
    2023-09-30
    容器 关键字 laravel
  • PHP中的Spring容器如何实现数组和容器的依赖注入?
    在PHP中,依赖注入是一种常见的实现方式,常用于解决对象之间的依赖关系。Spring容器是一个非常强大的依赖注入框架,它提供了一种灵活的方式来注入对象之间的依赖关系。在本文中,我们将介绍如何在PHP中使用Spring容器实现数组和容器的依...
    99+
    2023-06-19
    spring 数组 容器
  • Go 中的对象容器接口:如何轻松地实现依赖注入?
    随着现代软件开发中的应用程序规模越来越大,软件架构设计已经成为了一个非常重要的话题。在这个话题中,依赖注入是一个非常重要的设计模式。依赖注入是一种设计模式,它允许程序员把一个对象的依赖关系从代码中分离出来,从而可以更加灵活地管理这些依赖关...
    99+
    2023-07-03
    对象 容器 接口
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作