iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >ASP.NET MVC如何实现依赖注入
  • 713
分享到

ASP.NET MVC如何实现依赖注入

2023-06-28 02:06:44 713人浏览 泡泡鱼
摘要

这篇文章主要介绍了asp.net mvc如何实现依赖注入,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言在java的spring中有自动注入功能,使得代码变得更加简洁灵活,

这篇文章主要介绍了asp.net mvc如何实现依赖注入,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

前言

在java的spring中有自动注入功能,使得代码变得更加简洁灵活,所以想把这个功能移植到C#中,接下来逐步分析实现过程

1.使用自动注入场景分析

在asp.net mvc中,无论是什么代码逻辑分层,最终的表现层为Controller层,所以我们注入点就是在Controller中,这里我们需要替换默认的ControllerFactory,扫描代码中标记需要注入的对象,进行实例化注入

public class FastControllerFactory : DefaultControllerFactory {   public override IController CreateController(RequestContext requestContext, string controllerName)   {     Type type = this.GetControllerType(requestContext, controllerName);     Object obj = GetControllerInstance(requestContext, type);     //Controller中标记AutoWired属性的自动注入     List AutoWiredFieldList = type.GetRuntimeFields().Where(f => f.GetCustomAttribute(typeof(AutoWired)) != null).ToList();     foreach (FieldInfo field in AutoWiredFieldList)     {       field.SetValue(obj, InjectUtil.Container.Resolve(field.FieldType));     }     return obj as IController;   } }

FastControllerFactory就是我们自定义的一个Controller工厂,重写CreateController方法,对标记了AutoWired这个自定义注解的变量,从Bean容器中取出实例进行赋值,同时我们还需要在Global文件中的Start方法中,进行默认工厂进行替换

ControllerBuilder.Current.SetControllerFactory(new FastControllerFactory());

2.ioc容器的实现

c#中的自定义容器有很多开源成熟的框架,例如AutoFac等,这里我们是自己实现一个轻量级的版本

源码地址:https://gitee.com/grassprogramming/FastioC

这里就重点说一下如何在asp.net mvc中的使用,首先我们需要对需要注入的Bean对象进行标记,这个标记就叫做Component,

在asp.net mvc Global文件中的Start方法中,我们需要将整个项目中需要自动注入的Bean加入到容器中

public class InjectUtil {   public static ContainerBuilder Container;   public static void Init()   {     Container = new ContainerBuilder();      //获取所有程序集     var assemblies = System.WEB.Compilation.BuildManager.GetReferencedAssemblies().Cast().ToArray();     //注入所有Component组件     Container.ReGISterAssemblyTypes(assemblies, typeof(Component),true);     Container.Build();   } }

到这里Controller层面的事项就已经完成了,接下来就需要在IOC容器中初始化Bean实例方法中进一步处理

private Object GetInstance(RegisterEntity Entity)   {     Object obj = null;     if (Entity.IsEnableIntercept)     {       bool IsExtend = Entity.RealType == Entity.RegistType;       obj = DynamictProxy.CreateProxyObject(Entity.RealType, Entity.RegistType, Entity.InterceptType, IsExtend, Entity.IsInterceptAllMethod);     }     else     {       var constructors = Entity.RegistType.GetConstructors();       obj = constructors[0].Invoke(new Object[] { });     }     //这里使用单例模式将实例化Instance存储,提前暴露未进行后续设置的对象实例     if (!SingleInstanceDic.ContainsKey(Entity.RealType))     {       SingleInstanceDic.Add(Entity.RealType, obj);     }        //如果这个class标记了Component,且有标记了AutoWired的Field,进行自动注入     if (Entity.RealType.GetCustomAttribute(typeof(Component), true) != null)     {       //这里要使用GetRuntimeFields,此方法返回在指定类型上定义的所有字段,包括继承,非公共,实例和静态字段。       foreach (FieldInfo Field in Entity.RealType.GetRuntimeFields())       {         if (Field.GetCustomAttribute(typeof(AutoWired), true) != null)         {           Type FieldType = Field.FieldType;           if (Contains(FieldType))           {             //判断单例存储中是否包含,如果有,取出赋值,这里可以防止循环依赖导致的死循环             if (SingleInstanceDic.ContainsKey(FieldType))             {               Field.SetValue(obj, SingleInstanceDic[FieldType]);             }             else             {               Field.SetValue(obj, Resolve(FieldType));             }                        }         }       }     }     return obj;   }

GetInstance方法就是实例化Bean对象的核心方法,其实很简单,就是通过反射创建对象,其中需要注意的有两点

1)对于一个Bean初始化时需要扫描Bean中的所有变量,如果内部还有依赖注入的嵌套对象,需要使用递归,直到没有需要注入的Field

2)我这里使用的是单例模式,因为在测试过程中可能存在在A类中对B进行依赖注入,在B类中对A进行依赖注入,常规创建过程,如果使用递归进行扫描,就会进入死循环,内存溢出,所以使用对象的单例,一旦创建就放入字典中,如果再次扫描到该对象需要注入,则直接取出使用,就避免了循环引用

3.其他

对其他不在Controller中使用的类需要依赖注入,则需要直接从IOC的Bean容器取出使用

private AuthUtil @AuthUtil = InjectUtil.Container.Resolve();

感谢你能够认真阅读完这篇文章,希望小编分享的“ASP.NET MVC如何实现依赖注入”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: ASP.NET MVC如何实现依赖注入

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

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

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

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

下载Word文档
猜你喜欢
  • ASP.NET MVC如何实现依赖注入
    这篇文章主要介绍了ASP.NET MVC如何实现依赖注入,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言在java的spring中有自动注入功能,使得代码变得更加简洁灵活,...
    99+
    2023-06-28
  • ASP.NET Core MVC 依赖注入View与Controller
    目录一、ASP.NET Core MVC 之依赖注入 View 1.填充查找数据2.重写服务二、 ASP.NET Core MVC 之依赖注入 Controller1.构造...
    99+
    2022-11-12
  • ASP.NET MVC 3如何让依赖注入实现得更简单
    本篇文章为大家展示了ASP.NET MVC 3如何让依赖注入实现得更简单,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。我没有找到一个完整的示例,只有一些代码片断,于是,我将其整理了一翻,也有一点点个...
    99+
    2023-06-17
  • ASP.NET Core MVC控制器请求依赖注入
    ASP.NET Core MVC 控制器应通过构造函数明确地请求它们地依赖关系,在某些情况下,单个控制器地操作可能需要一个服务,在控制器级别上的请求可能没有意义。在这种情况下,也可以...
    99+
    2022-11-13
  • ASP.NET Core MVC如何创建控制器与依赖注入
    这篇文章主要介绍“ASP.NET Core MVC如何创建控制器与依赖注入”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ASP.NET Core MVC如何创...
    99+
    2023-06-29
  • Asp.net core中依赖注入的实现
    使用服务 在Asp.net core的Controller中,可以通过如下两种方式获取系统注入的服务: 构造函数 可以直接在构造函数中传入所依赖的服务,这是非常常见的DI注入方式。 ...
    99+
    2022-11-13
  • ASP.NET Core实现自动依赖注入
    目录定义一个枚举定义三种注入类型扫描运行目录下所有的dll,进行自动注入使用自动依赖注入功能 在开发.NET Core web服务的时候,我们习惯使用自带的依赖注入容器来进行注入。 ...
    99+
    2022-11-12
  • ASP.NET Core MVC创建控制器与依赖注入讲解
    默认的IControllerActivator 在 ASP.NET Core 中,当 MVC 中间件接收到请求时,通过路由选择要执行的控制器和操作方法。为了实际的执行操作, MVC ...
    99+
    2022-11-13
  • ASP.NET Core依赖关系注入怎么实现
    本篇内容主要讲解“ASP.NET Core依赖关系注入怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ASP.NET Core依赖关系注入怎么实现”吧!1.前言面向对象...
    99+
    2023-06-29
  • ASP.NET Core依赖注入实例分析
    今天小编给大家分享一下ASP.NET Core依赖注入实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。ASP...
    99+
    2023-06-30
  • ASP.net core使用Autofac实现泛型依赖注入
    目录什么是泛型依赖注入.net core里实现泛型依赖注入安装AutofacIMyRepository定义仓储接口MyRepositoryBase仓储实现在Program声明实现依赖...
    99+
    2022-11-13
  • ASP.NET Core实现自动依赖注入的示例
    这篇文章主要介绍了ASP.NET Core实现自动依赖注入的示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在开发.NET Core web服务的时候,我们习惯使用自带的依...
    99+
    2023-06-14
  • ASP.NET Core依赖注入DI容器怎么实现
    这篇文章主要介绍“ASP.NET Core依赖注入DI容器怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ASP.NET Core依赖注入DI容器怎么实现”文章能帮助大家解...
    99+
    2023-07-05
  • AngularJS如何实现依赖注入
    小编给大家分享一下AngularJS如何实现依赖注入,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!简介:首先我们需要理解什么是依...
    99+
    2022-10-19
  • SpringBoot中如何实现注入依赖
    SpringBoot中如何实现注入依赖?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。今天给大家介绍一下SpringBoot中是如何实现依赖注入的功能。在以往spring使用...
    99+
    2023-05-31
    springboot bo 依赖注入
  • ASP.net core怎么使用Autofac实现泛型依赖注入
    本文小编为大家详细介绍“ASP.net core怎么使用Autofac实现泛型依赖注入”,内容详细,步骤清晰,细节处理妥当,希望这篇“ASP.net core怎么使用Autofac实现泛型依赖注入”文章能帮助大家解决疑惑...
    99+
    2023-06-30
  • 如何在PHP中实现依赖注入
    这篇文章给大家介绍如何在PHP中实现依赖注入,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。首先,我们来看一段代码:class A{      &nb...
    99+
    2023-06-17
  • java Spring中如何实现依赖注入
    总得来说,Spring中依赖注入有这么三种方式:①通过set方式赋值②通过构造器赋值③通过p标签赋值java相关视频教程推荐:java视频下面我们稍稍展开来谈:1.通过set方式赋值 主要用到围堵标签来传递值此处的name就是Teach...
    99+
    2019-11-15
    java教程 java Spring 依赖注入
  • golang依赖注入怎么实现
    在Go语言中实现依赖注入可以使用两种常见的方式:构造函数注入和接口注入。1. 构造函数注入:构造函数注入是通过在结构体中定义一个包含...
    99+
    2023-09-17
    golang
  • Angular依赖注入怎么实现
    今天小编给大家分享一下Angular依赖注入怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作