.Net6.0系列-7 依赖注入(一)

这篇具有很好参考价值的文章主要介绍了.Net6.0系列-7 依赖注入(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

依赖注入(Dependency Injection,DI)是控制反转(Inversion of Control,IOC)思想的实现方式,依赖注入简化模块的组装过程,降低模块之间的耦合度.
DI的几个概念:
服务(Service):和框架请求之后返回的一个对象,可以是一个数据库链接,也可以是一个文件处理的方法,或者是数据处理的一个过程方法
注册服务:将上面向框架要的这个服务先注册,才能向框架请求
服务容器:负责管理注册的服务
查询服务:创建对象及关联对象
对象生命周期有三种:
(1)Transient(瞬态):获取服务对象每次获取都是一个新的对象
(2)Scoped(范围):在特定范围内再次获取为同一个对象
(3)Singleton(单例):就这一个对象,每次获取都是他
如果一个类实现了IDisposable接口,则离开作用域后容器会自动调用对象的Dispose方法,参考Using
生命周期的选择:如果类无状态,建议选为Singleton,如果类中有状态且有Scope控制就使用Scoped

.Net中使用DI
1.根据类型来获取和注册服务:
可以分别指定服务类型和实现类型.这两者可能相同,也可能不同.服务类型可以是类,也可以是接口,一般面向接口编程更灵活
2…Net控制反转组件取名为DependencyInjection,但是包含ServiceLocator的功能
3.ServiceCollection用来构造容器对象IServiceProvider,调用ServiceCollection的BuliderServiceProvider()创建ServiceProvider,可以用来获取BuliderServiceProvider()之前ServiceCollection中的对象
安装包需求:
Install-Package Microsoft.Extensions.DependencyInjection
using Microsoft.Extensions.DependencyInjection

GetService是根据注册对象来返回的
GetRequiredService:没有服务就抛出异常,因为required是必须有服务,当有多个服务的时候获取的是最后一个服务
GetServices:获取注册的所有的服务,

public interface ITestService
{
	public string Name{get;set;}
	public void SayHi();
}

public class TestServiceImpl:ItestService
{
	public string Name{get;set;}
	public void SayHi()
	{
		Console.WriteLine($"Hi,I'm{Name}");
	}
}
public class TestServiceImpl2:ItestService
{
	public string Name{get;set;}
	public void SayHi()
	{
		Console.WriteLine($"你好,我是{Name}");
	}
}

static void Main(string[] args)
{
	#region 直接注册实现类,和接口没有关系,将实现类注册到服务容器中,然后通过实现类获取服务
	ServiceCollection services=new ServiceCollection();
	services.AddTransient<TestServiceImpl>();
	//下面是两种申请服务的方法,一种是sp.GetServices/一种是sp.CreateScope()
	using(ServiceProvider sp= services.BulidServiceProvider())
	{
		TestServiceImpl tsi=sp.GetService<TestServiceImpl>();
		t.Name="cdc";
		t.SayHi();
        using(IServiceScope scope1=sp.CreateScope())
        {
			TestServiceImpl t=scope1.ServiceProvider.GetService<TestServiceImpl>();
		}
	}
	#endregion
}

static void Main(string[] args)
{
	ServiceCollection services=new ServiceCollection();
	//注册类型是接口,实现类型是方法
	services.AddScoped<ITestService,TestServiceImpl>();
	//这种写法是为了传参数
	services.AddSingleton<ITestService,new TestServiceImpl()>
	using(ServiceProvider sp=services.BulidServiceProvider())
	{
		ITestService ts1=sp.GetService<ITestService>();
		//ITestService ts1=(ITestService)sp.GetService(typeof(ITestService));
		ts1.Name="cdc";		
		ts1.SayHi();		
	}

}


DI会传染的简单范例文章来源地址https://www.toymoban.com/news/detail-410803.html

namespace DIGOALL
{
	class Progrom
	{
		static void Main(string[] args)
		{
			ServiceClolection services=new ServiceCollection();
			services.AddScoped<Controller>();
			services.AddScoped<ILog,LogImpl>();
			services.AddScoped<IStorage,StorageImpl>();
			services.AddScoped<IConfig,ConfigImpl>();
			using(var sp= services.BulidServiceProvider())
			{
				var c=sp.GetRequiredService<Controller>();
				c.Test();
			}
			Console.ReadKey();
		}
	}
	class  Controller
	{
		private readonly ILog log;
		private readonly IStorage storage;
		public Controller(ILog log,IStorage storage) 
		{
			this.log=log;
			this.storage=storage;
		}
	
		public void Test()
		{
			this.log.Log("开始上传");
			this.storage.Save("写入的东西","1.txt");
			this.log.Log("上传完毕");
		}
	}
	
	#region 日志类
	interface ILog
	{
		public void Log(string msg);
	}
	class LogImpl:ILog
	{
		public void Log(string msg)
		{
			Console.WriteLine($"日志:{msg}");
		}
	}
	#endregion
	
	#region 
	interface IConfig
	{
		public string GetValue(string name);
	}
	class ConfigImpl:IConfig
	{
		public void GetValue(string name)
		{
		 	return "hello";
		}		
	}
	#endregion
	
	#region 云存储
	interface IStorage
	{
		public void Save(string content,string name);
	}
	class StorageImpl:IStorage
	{
		**关键点:获取配置服务,构造函数中赋值给成员变量**
		private readonly IConfig config;		
		public StorageImpl(IConfig config)
		{
			this.config=config;
		}
		public void Save(string content,string name)
		{
			string server=config.GetValue("server");
			Console.WriteLine($"向服务器{server}的文件名为{name}上传{content}");
		}
	}
	#endregion
}

到了这里,关于.Net6.0系列-7 依赖注入(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入

    前言:在C/S架构上,WPF无疑已经是“桌面一霸”了。在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用。但是WPF也有很多年的历史了,并且基于MVVM的开发模式,受到了很多开发者的喜爱。 并且随着工业化的进展,以及几年前微软对.NET平台的开源,国内大多

    2024年02月06日
    浏览(63)
  • ASP.NET Core 依赖注入系列一

    什么是ASP.NET Core 依赖注入? 依赖注入也称DI是一项技术用来实现对象松耦合以至于应用程序更容易维护,ASP.NET Core通过控制器的构造函数自动注入依赖的对象,我们创建ASP.NET Core MVC应用程序演示依赖注入特性是如何工作, 在这节中我们讲解该特性 1 例子 我们创建一个ASP.NET C

    2024年02月11日
    浏览(54)
  • 什么是依赖注入(Dependency Injection)?

    依赖注入(Dependency Injection,简称DI)是一种设计模式,用于实现类之间的解耦和依赖关系的管理。它通过将依赖关系的创建和维护责任转移到外部容器中,使得类不需要自己实例化依赖对象,而是由外部容器动态地注入依赖。 传统的对象创建方式往往由类自身负责创建和管

    2024年02月15日
    浏览(43)
  • Angular 17+ 高级教程 – Dependency Injection 依赖注入

    本来是想先介绍 Angular Component 的,但 Component 里面会涉及到一些 Dependency Injection (简称 DI) 的概念,所以还是先介绍 DI 吧。 温馨提醒:如果你对 JS class、prototype 不太熟悉的话,建议你先看这篇 JavaScript – 理解 Object, Class, This, Prototype, Function, Mixins   首先我们有一个 class Ser

    2024年03月09日
    浏览(64)
  • Go 开源库运行时依赖注入框架 Dependency injection

    一个Go编程语言的运行依赖注入库。依赖注入是更广泛的控制反转技术的一种形式。它用于增加程序的模块化并使其具有可扩展性。 依赖注入是更广泛的控制反转技术的一种形式。它用于增加程序的模块化并使其具有可扩展性。 Providing Extraction Invocation Lazy-loading Interfaces Gro

    2024年02月07日
    浏览(52)
  • Spring6-IoC(Inversion of Control)控制反转和DI(Dependency Injection)依赖注入,手动实现IOC

    Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的 反射机制 。简单来说, 反射机制指的是程序在运行时能够获取自身

    2024年02月09日
    浏览(62)
  • “warning NU1701: 项目依赖包与项目框架net6.0不完全兼容“

    一个Net6的Web项目,有一个警告: 在项目文件里,这样 在nuget包管理器界面,看到 Microsoft.AspNet.WebApi.Core 的信息,其依赖于 Microsoft.AspNet.WebApi.Client ,且其也满足 。NetStandard V2。0 的,但看这个 Client ,其又依赖于NewtonnSoft.Json的旧版本,从而导致依赖链最终到了 NetFramework4.* 的

    2024年02月15日
    浏览(63)
  • 【ASP.NET Core 基础知识】--依赖注入(DI)--什么是依赖注入

    依赖注入(Dependency Injection,简称DI)是一种设计模式,用于解耦和管理类之间的依赖关系。它的核心思想是将原本需要在代码中显式创建的依赖关系,交给外部容器进行控制和管理。 具体来说,依赖注入的实现方式是通过将依赖对象的创建和维护责任转移到外部容器中,使

    2024年01月23日
    浏览(64)
  • .NET Core 依赖注入

    在.NET Core中,依赖注入(Dependency Injection,简称DI)是框架的一个重要特性,可以帮助我们解耦代码、管理对象生命周期以及提高可测试性等.一下是.NET Core中依赖注入的一些基本概念和用法: 1、服务(Service):在DI中,服务即一个对象或者类型。用于完成特定的功能.例如,数据库访

    2023年04月24日
    浏览(44)
  • .NET使用依赖注入,控制反转

    .NET 支持依赖项注入 (DI) 软件设计模式,这是一种在类及其依赖项之间实现 控制 (IoC) 的反转 的技术 避免有状态的、静态类和成员。 通过将应用设计为改用单一实例服务,避免创建全局状态。 避免在服务中直接实例化依赖类。 直接实例化会将代码耦合到特定实现。 不在服务

    2023年04月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包