云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

百度云_我有盛世美颜百度云_学生机

小七 141 0

.NET版了解.NETCore中的依赖注入了解什么是依赖注入和IoC,以及.netcore为支持它们提供了什么。

依赖注入是帮助您创建更易于维护的代码的最著名的技术之一。netcore为依赖注入提供了广泛的支持,但是如何应用它可能并不总是很清楚。本教程将尝试澄清各种依赖注入概念,并将向您介绍.NETCore提供的支持。依赖性问题您是否曾经因为一个新的简单需求而不得不更改许多代码?你是否曾在尝试重构应用程序的一部分时遇到过困难?您是否曾经因为组件需要其他组件而在编写单元测试时遇到麻烦?如果您对这些问题中的任何一个回答是肯定的,那么您的代码库可能会受到依赖性的影响。这是应用程序代码的一个典型疾病,当它的组件过于耦合时。换句话说,当一个组件过于依赖另一个组件时。组件依赖的主要影响是代码的维护难度,这当然意味着更高的成本。依赖关系示例看一个典型的受依赖关系影响的代码示例。从分析这些C类开始:使用系统;使用System.Collections.Generic;命名空间OrderManagement{公共秩序{公共字符串CustomerId{get;set;}公共日期时间日期{get;set;}公共十进制TotalAmount{get;set;}公共列表Items{get;set;}公共秩序(){Items=新列表();}}公共类OrderItem{公共字符串ItemId{get;set;}公共十进制数量{get;set;}公共十进制价格{get;set;}}}这段代码定义了两个类,Order和OrderItem,它们表示客户的订单。订单由OrderManager类管理,实现如下:使用系统线程化任务;命名空间OrderManagement{公共类订单管理器{公共异步任务传输(顺序){var orderSender=新的orderSender();返回等待orderSender。发送(命令);}}}OrderManager类实现Transmit()方法,该方法将订单发送到另一个服务进行处理。它依赖于OrderSender类实际发送作为参数接收的订单。这是实现OrderSender类的代码:使用系统.Net.Http;使用系统文本;使用System.Text.Json文件;使用系统线程化任务;命名空间OrderManagement{公共类OrderSender{私有静态只读HttpClient HttpClient=new HttpClient();公共异步任务Send(订单顺序){变量jsonOrder=JsonSerializer.Serialize(顺序);var stringContent=新的stringContent(jsonOrder,UnicodeEncoding.UTF8,"应用程序/json");//此语句调用不存在的URL。这只是一个例子。。。var响应=等待httpClient.postsync("https://mymicroservice/myendpoint",字符串含量);返回response.Content.ReadAsStringAsync()结果;}}}如您所见,该类的Send()方法序列化了订单,并通过httppost将其发送到一个假设的微服务中,该微服务将处理订单。这里显示的代码并不实际。只是一个粗略的例子。如果您需要更改发送订单的方式,会发生什么情况?例如,假设您还想通过电子邮件发送订单,或者将订单发送到另一个使用gRPC而不是HTTP的微服务。另外,您觉得为OrderManager类创建单元测试有多舒服?由于OrderManager依赖于OrderSender,您将被迫以某种方式更改这两个类以支持多个发送方类型。较低级别组件(OrderSender)中的更改可能会影响较高级别的组件(OrderManager)。更糟糕的是,如果不冒着弄乱代码的风险自动测试OrderManager类几乎是不可能的。这只是一个简单的研究案例。考虑一下依赖关系在一个包含许多依赖组件的更复杂场景中可能产生的影响。那真的会变成一个巨大的混乱。依赖倒置原则最后一个可靠的原则提出了一种减轻依赖性问题并使其更易于管理的方法。这一原理被称为依赖反转原理,它指出:高级模块不应依赖于低级模块。两者都应该依赖于抽象抽象不应该依赖细节。细节应该依靠抽象。您可以将这两个正式的建议翻译如下:在应用程序的典型分层体系结构中,高级组件不应直接依赖于较低级别的组件。您应该创建一个抽象(例如,一个接口),并使两个组件都依赖于这个抽象。以图形方式翻译,如下图所示:当然,所有这些看起来都太抽象了。好吧,本文将为您提供一些示例,以阐明有关依赖性的概念以及减轻依赖性的技术。虽然一般概念对任何编程语言和框架都是有效的,但本文将重点关注.NET核心框架,并将说明它提供的基础结构,以帮助您减少组件依赖性。"了解什么是依赖注入,以及如何使用它改进.NET Core中的代码维护。"在推特上留言用属地术语的旅行在探索.NET为您提供了什么来对抗代码的依赖性疾病之前,有必要对术语进行一些排序。您可能听说过许多关于代码依赖性的术语和概念,其中有些似乎非常相似,可能会令人困惑。好吧,下面是一个对最常见的定义的尝试:依赖倒置原则:这是一个软件设计原则;它建议解决依赖问题,但没有说明如何实现它或使用哪种技术。控制反转(inversionofcontrol,IoC):这是应用依赖反转原理的一种方法。控制反转是一种实际的机制,它允许您的高级组件依赖抽象,而不是底层组件的具体实现。控制权倒置也被称为好莱坞原则。这个名字来自好莱坞电影业,在一个演员角色的试镜后,导演通常会说,不要打电话给我们,我们会打给你的。依赖注入:这是一种实现控制反转的设计模式。它允许您将低级组件的具体实现注入到高级组件中。DI(注入)是一个容器,它也提供了一个容器的自动依赖关系。依赖注入方法依赖注入可能是解决依赖问题的最著名的技术。您可以使用其他设计模式,例如Factory或Publisher/Subscriber模式来减少组件之间的依赖性。但是,它主要源于代码试图解决的问题类型。如上所述,这是一种为组件提供依赖项的技术,防止组件自身实例化。您可以通过创建较低级别组件的实例并将其传递给较高级别的组件来实现依赖注入。您可以使用以下三种常用方法:构造函数注入:使用这种方法,您可以创建依赖项的实例,并将其作为参数传递给依赖类的构造函数。方法注入:在本例中,创建依赖项的实例并将其传递给依赖类的特定方法。属性注入:此方法允许您将依赖项的实例分配给依赖类的特定属性。.NET核心和依赖注入您可以使用前面讨论的三种方法中的一种或多种来手动实现依赖注入。然而,.netcore附带了一个内置的IoC容器,它简化了依赖注入管理。IoC容器负责支持自动依赖注入。其基本特征包括:注册:IoC容器需要知道要为特定依赖项创建哪种类型的对象;因此,它提供了一种将类型映射到类的方法,以便创建正确的依赖实例。解析:这个特性允许IoC容器通过创建一个对象并将其注入请求类来解析依赖关系。由于这个特性,您不必手动实例化对象来管理依赖关系。部署:IoC容器按照特定的标准管理依赖项的生存期。稍后您将看到这些功能的实际应用。但在此之前,需要一些基本信息。.NET核心内置的IoC容器实现IServiceProvider接口。因此,如果出于某种原因,您想创建自己的IoC容器,那么应该实现这个接口。在.NETCore中,容器管理的依赖项称为服务。您有两种类型的服务:框架服务:这些服务是.NET核心框架的一部分;框架服务的一些例子有IApplicationBuilder、IConfiguration、ILoggerFactory等。应用程序服务:这些是您在应用程序中创建的服务;由于IoC不知道它们,所以您需要显式地注册它们。处理框架服务作为.NET核心开发人员,您已经使用内置的IoC容器来注入框架服务。的确,.NET核心非常依赖它。例如,在ASP.NET应用程序广泛使用依赖注入:公共类启动{公共启动(IConfiguration配置){// ... 代码。。。}public void Configure(IApplicationBuilder应用程序,IWebHostEnvironment环境){