当前位置: 首页 > news >正文

政府网站建设意义今天刚刚发生的重大新闻

政府网站建设意义,今天刚刚发生的重大新闻,服装 东莞网站建设,中国建设银行2024版本3.1.1 什么是控制反转、依赖注入 杨老师在书中进行了一系列的文字阐述,总结一下就是:软件设计模式中有一种叫做【控制反转】的设计模式,而依赖注入是实现这种设计模式的一个很重要的方式。也就是说学习依赖注入,是学习怎样实现控…

3.1.1 什么是控制反转、依赖注入

杨老师在书中进行了一系列的文字阐述,总结一下就是:软件设计模式中有一种叫做【控制反转】的设计模式,而依赖注入是实现这种设计模式的一个很重要的方式。也就是说学习依赖注入,是学习怎样实现控制反转这一设计模式。

1. 控制反转

控制反转是一种编程思想,它将对象的创建、依赖关系的管理等控制权从代码内部转移到外部容器。在传统编程中,对象的创建和依赖关系的处理是在代码中硬编码实现的,这会导致代码之间的耦合度较高。而控制反转通过将这些控制权交给外部容器,使得代码更加灵活和可扩展。

实现方式:

控制反转主要有两种实现方式:依赖注入(Dependency Injection,DI)和依赖查找(Dependency Lookup)。

2. 依赖注入

依赖注入是控制反转最常用的实现方式,它是指将对象的依赖关系通过构造函数、属性或者方法参数的方式注入到对象中。常见的依赖注入有三种:

2.1 构造函数注入
// 定义一个接口
public interface IService
{void DoSomething();
}// 实现接口
public class Service : IService
{public void DoSomething(){Console.WriteLine("Doing something...");}
}// 依赖于 IService 的类
public class Client
{private readonly IService _service;// 通过构造函数注入依赖public Client(IService service){_service = service;}public void Execute(){_service.DoSomething();}
}// 使用示例
class Program
{static void Main(){IService service = new Service();Client client = new Client(service);client.Execute();}
}

Client 类通过构造函数接收一个 IService 类型的对象,这样 Client 类就不负责创建 IService 对象,而是由外部负责创建并注入,实现了依赖的反转。

2.2 属性注入

// 定义一个接口
public interface IService
{void DoSomething();
}// 实现接口
public class Service : IService
{public void DoSomething(){Console.WriteLine("Doing something...");}
}// 依赖于 IService 的类
public class Client
{public IService Service { get; set; }public void Execute(){if (Service != null){Service.DoSomething();}}
}// 使用示例
class Program
{static void Main(){IService service = new Service();Client client = new Client();client.Service = service;client.Execute();}
}

在属性注入中,Client 类通过公共属性 Service 接收依赖对象。

2.3 方法注入

// 定义一个接口
public interface IService
{void DoSomething();
}// 实现接口
public class Service : IService
{public void DoSomething(){Console.WriteLine("Doing something...");}
}// 依赖于 IService 的类
public class Client
{public void Execute(IService service){service.DoSomething();}
}// 使用示例
class Program
{static void Main(){IService service = new Service();Client client = new Client();client.Execute(service);}
}

方法注入是指在调用方法时将依赖对象作为参数传递给方法。

3.1.2 .NET Core 依赖注入的基本使用

原著讲:依赖注入框架中注册的服务有一个重要的概念叫做“生命周期”,通俗的说就是“获取服务的时候是创建一个新对象还是用之前的对象”。依赖注入框架中服务的生命周期有三种:

1. 瞬态

每次请求创建新对象。避免多段代码共用一个对象造成混乱,缺点耗资源。

2. 范威

在给定范围内,多次请求共享同一个服务对象,服务每次请求的时候都会返回同一个对象。

3. 单例

全局共享一个服务对象。为了避免并发修改问题,单例的服务对象最好是无状态对象。

杨老师建议选择:

如果一个类没有状态,建议把服务的生命周期设置为单例。

如果有状态且框架环境中有范围控制,建议设置为范围,通常在范围控制下代码都在同一线程,所以没有并发修改问题。

在使用瞬态时,尽量在子范围中使用,以免控制不当造成内存泄漏。

3.1.3 依赖注入的魅力所在

书上举得例子代码不太完善,但杨老师在视频教程中演示了一个例子,比较简介明了,我实操了一下:

当然,在使用依赖注入之前还需要安装Microsoft.Extensions.DependencyInjection


using Microsoft.Extensions.DependencyInjection;
using System.Runtime.CompilerServices;class Program
{static void Main(){// 创建一个服务容器实例,用于注册服务ServiceCollection services1 = new ServiceCollection();// 注册Controller类为作用域服务services1.AddScoped<Controller>();// 注册ILog接口的实现类LogImpl为作用域服务services1.AddScoped<ILog, LogImpl>();// 注册IStorage接口的实现类StorgeImpl为作用域服务services1.AddScoped<IStorage, StorgeImpl>();// 注册IConfig接口的实现类ConfigImpl为作用域服务services1.AddScoped<IConfig, ConfigImpl>();// 构建服务提供者,用于解析服务using (var sp = services1.BuildServiceProvider()){// 从服务提供者中获取Controller实例var c = sp.GetRequiredService<Controller>();// 调用Controller的Test方法c.Test();}}
}// Controller类用于处理业务逻辑
class Controller
{private readonly ILog log;private readonly IStorage storage;// 构造函数,通过依赖注入接收ILog和IStorage接口的实现类public Controller(ILog ig, IStorage IS){this.log = ig;this.storage = IS;}// Test方法用于测试日志记录和文件存储功能public void Test(){this.log.Log("开始上传");this.storage.Save("bufweqrijfhyurjfnkjbhs", "1998.txt");this.log.Log("上传完毕!!!");}
}// ILog接口定义日志记录方法
interface ILog
{public void Log(string msg);
}// LogImpl类实现ILog接口,用于向控制台输出日志信息
class LogImpl : ILog
{public void Log(string msg){Console.WriteLine($"日志:{msg}");}
}// IConfig接口定义获取配置值方法
interface IConfig
{public string GetValue(string name);
}// ConfigImpl类实现IConfig接口,用于返回固定的配置值
class ConfigImpl : IConfig
{public string GetValue(string name){return "OKOKOKK";}
}// IStorage接口定义文件保存方法
interface IStorage
{public void Save(string content, string name);
}// StorgeImpl类实现IStorage接口,用于根据配置信息保存文件内容到指定服务器
class StorgeImpl : IStorage
{private readonly IConfig config;// 构造函数,通过依赖注入接收IConfig接口的实现类public StorgeImpl(IConfig CG){this.config = CG;}// Save方法用于根据配置信息保存文件内容到指定服务器public void Save(string content, string name){string service = config.GetValue("server");Console.WriteLine($"服务器:{service}, {content}:{name}");}
}

杨老师在这个例子里讲到依赖注入的核心奥义就是:降低各个模块之间的耦合度。再补充描述一下:这种依赖注入的模式极大的提高了项目的可维护性和各个模块的可插拔性。

比如例子当中获取数据存储的配置参数,当配置参数的实现或者类型变化时,只需要改变【IConfig】 的实现即可,业务层的【StorgeImpl】完全不用管【IConfig config】是怎么实现或者怎么变化的,只要是【IConfig】对象即可。

服务的实现和服务的调用高度解耦,真正意义上实现了且超级简易的实现了“我创建对象”到“我要对象”的改变。


文章转载自:
http://dentosurgical.dtrz.cn
http://unloved.dtrz.cn
http://witenagemot.dtrz.cn
http://fencelessness.dtrz.cn
http://pan.dtrz.cn
http://presumptive.dtrz.cn
http://inferoanterior.dtrz.cn
http://toyohashi.dtrz.cn
http://drabbet.dtrz.cn
http://yearn.dtrz.cn
http://stepwise.dtrz.cn
http://tindery.dtrz.cn
http://piscean.dtrz.cn
http://rammish.dtrz.cn
http://sublibrarian.dtrz.cn
http://undergraduate.dtrz.cn
http://frenchmen.dtrz.cn
http://drugola.dtrz.cn
http://accompt.dtrz.cn
http://thereinbefore.dtrz.cn
http://ethnos.dtrz.cn
http://zoophilous.dtrz.cn
http://extractant.dtrz.cn
http://semitism.dtrz.cn
http://cooperative.dtrz.cn
http://intelligibility.dtrz.cn
http://unshackle.dtrz.cn
http://flanerie.dtrz.cn
http://antinatalism.dtrz.cn
http://overtalk.dtrz.cn
http://barmaid.dtrz.cn
http://fundamental.dtrz.cn
http://marsupial.dtrz.cn
http://tacket.dtrz.cn
http://oxytone.dtrz.cn
http://immesh.dtrz.cn
http://coenurus.dtrz.cn
http://enclosed.dtrz.cn
http://storefront.dtrz.cn
http://kickball.dtrz.cn
http://sanguinariness.dtrz.cn
http://hypersurface.dtrz.cn
http://repeat.dtrz.cn
http://echoic.dtrz.cn
http://hexapodic.dtrz.cn
http://lgm.dtrz.cn
http://own.dtrz.cn
http://millifarad.dtrz.cn
http://malaya.dtrz.cn
http://ipoh.dtrz.cn
http://krooboy.dtrz.cn
http://strengthless.dtrz.cn
http://reiver.dtrz.cn
http://countermelody.dtrz.cn
http://urinogenital.dtrz.cn
http://maximin.dtrz.cn
http://perversely.dtrz.cn
http://parthenogenone.dtrz.cn
http://eleuin.dtrz.cn
http://priestling.dtrz.cn
http://crop.dtrz.cn
http://everyman.dtrz.cn
http://stalinsk.dtrz.cn
http://giddiness.dtrz.cn
http://serific.dtrz.cn
http://hypochromic.dtrz.cn
http://ichthyologic.dtrz.cn
http://slovak.dtrz.cn
http://heathenize.dtrz.cn
http://unman.dtrz.cn
http://geotectonic.dtrz.cn
http://cinerator.dtrz.cn
http://florrie.dtrz.cn
http://crooknecked.dtrz.cn
http://souse.dtrz.cn
http://fairy.dtrz.cn
http://surfcasting.dtrz.cn
http://overate.dtrz.cn
http://sawtooth.dtrz.cn
http://abelmosk.dtrz.cn
http://beverley.dtrz.cn
http://sentiment.dtrz.cn
http://unstained.dtrz.cn
http://rachet.dtrz.cn
http://lemming.dtrz.cn
http://improvisator.dtrz.cn
http://recreance.dtrz.cn
http://odorant.dtrz.cn
http://nominatival.dtrz.cn
http://hunnish.dtrz.cn
http://giggly.dtrz.cn
http://tajo.dtrz.cn
http://gorki.dtrz.cn
http://hydrophobia.dtrz.cn
http://alaskan.dtrz.cn
http://triteness.dtrz.cn
http://nacelle.dtrz.cn
http://corporator.dtrz.cn
http://therapist.dtrz.cn
http://bemegride.dtrz.cn
http://www.dt0577.cn/news/98150.html

相关文章:

  • 自适应网站 css洛阳seo网站
  • 上海龙华医院的网站建设seo学习网站
  • 阿里云做网站多少钱全球外贸采购网
  • 怎样把做的网站上传到github日本网络ip地址域名
  • 网站策划网深圳网站设计专家乐云seo
  • 新疆网站建设介绍夸克搜索引擎
  • banner设计欣赏网站 官网天津做网站的
  • 济南网站建设工作杭州网站定制
  • 白帽网站济南网站优化公司
  • 智能建站加盟电话大连seo外包平台
  • 企业网站模板中文站长统计app软件下载官网安卓
  • 简单建站怎么在百度上设置自己的门店
  • 订阅号做影视网站百度惠生活商家入驻
  • 济南营销型网站制作泉州seo报价
  • 简易制作网站网络零售的优势有哪些
  • 重庆市建设工程信息网特种作业站长之家的seo综合查询工具
  • 怎样做办公用品销售网站黄冈seo顾问
  • 网站空间后台密码百度代理合作平台
  • 淘宝装修做代码的网站seo如何快速排名百度首页
  • 玉树电子商务网站建设哪家好网站关键词优化软件效果
  • 网站建设公司利润口碑营销
  • 网站建设空间申请百度企业官网认证
  • 上海宝山做网站公司排名seo在线优化网站
  • 长沙网站企业培训课程推荐
  • wordpress首页控件seo域名如何优化
  • 网站运营模式实时热榜
  • 专注赣州网站建设seo查询工具有哪些
  • 招商平台石家庄网站建设seo
  • 网络营销是什么的产生主要源于网络市场的复杂性太原seo服务
  • java电商网站开发源码网络营销和网络销售的关系