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

学校网站源码软文写作公司

学校网站源码,软文写作公司,免费24小时在线咨询,海南省建设执业资格管理中心网站在WPF开发中,依赖注入(Dependency Injection)和控制反转(Inversion of Control)是程序解耦的关键,在当今软件工程中占有举足轻重的地位,两者之间有着密不可分的联系。今天就以一个简单的小例子&…

在WPF开发中,依赖注入(Dependency Injection)和控制反转(Inversion of Control)是程序解耦的关键,在当今软件工程中占有举足轻重的地位,两者之间有着密不可分的联系。今天就以一个简单的小例子,简述如何在WPF中实现依赖注入和控制反转,仅供学习分享使用,如有不足之处,还请指正。

什么是依赖注入和控制反转?

依赖注入又称为依赖项注入,那什么是依赖项呢?比如在一个类A中,实现某中功能,而此功能是另外一个类B实现的,那就说明A依赖B,B就是A的依赖项。或者是另一个对象A所依赖的对象B。示例如下:

namespace DemoIoc
{public class MessageWriter{public void Print(string message){Console.WriteLine($"MessageWriter.Write(message: \"{message}\")");}}public class Worker : BackgroundService{private readonly MessageWriter writer = new();protected override async Task ExecuteAsync(CancellationToken stoppingToken){while (!stoppingToken.IsCancellationRequested){writer.Print($"Worker running at: {DateTimeOffset.Now}");await Task.Delay(1_000, stoppingToken);}}}
}

 

注意:在上述示例中,Worker类依赖于MessageWriter类,所以MessageWriter就是Worker的依赖项。 硬编码的依赖项(如前面的示例)会产生问题,应避免使用

强依赖关系具有以下几个问题:

  • 如果要用不同的实现替换 MessageWriter,必须修改 Worker 类。
  • 如果 MessageWriter 具有依赖项,则必须由 Worker 类对其进行配置,且很难进行初始化。
  • 这种实现很难进行单元测试。

那如何解决上述依赖关系所造成的弊端呢?答案就是依赖项注入。可通过如下几个步骤实现:

  • 使用接口或基类将依赖关系实现抽象化。
  • 在服务容器中注册依赖关系。
  • 将服务注入到使用它的类的构造函数中。

 .NET 提供了一个内置的服务容器 IServiceProvider。 服务通常在应用启动时注册,并追加到 IServiceCollection。 添加所有服务后,可以使用 BuildServiceProvider 创建服务容器。 框架负责创建依赖关系的实例,并在不再需要时将其释放。

简单一句话说:依赖注入(DI)将所依赖的对象参数化,接口化,并且将依赖对象的创建和释放剥离出来,这样就做到了解耦,并且实现了控制反转(IoC)

控制反转(IoC)具有如下两个特点:

  • 高等级的代码不能依赖低等级的代码;
  • 抽象接口不能依赖具体实现;

控制反转解决代码的强耦合,增加了代码的可扩展性。依赖注入将依赖具体实现类和控制实现类的创建和释放,变成了依赖接口或抽象类,不再控制接口的创建和释放。两者之间相辅相成,互相成就。

WPF中实现依赖注入的步骤

1. 安装DI库

首先创建一个WPF应用程序,然后在Nuget包管理器中安装微软提供的依赖注入库【Microsoft.Extensions.DependencyInjection】,如下所示:

2. 创建接口和实现类

创建测试用的接口ITextService和实现类TextService,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace DemoIoc
{public interface ITextService{public string GetText();}public class TextService : ITextService{public string GetText(){return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");}}
}

 

3. 接口注入

在需要调用的地方(如:MainWindow)进行ITextService接口注入,如下所示:

namespace DemoIoc
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{private ITextService textService;public MainWindow(ITextService textService){this.textService = textService;InitializeComponent();}private void Window_Loaded(object sender, RoutedEventArgs e){this.txtCurrentTime.Text = textService.GetText();}}
}

 

注意:以上可以看出MainWindow依赖ITextService接口,而不依赖于接口的实现。这样就实现了依赖注入。

4. 配置容器

在启动程序App.xaml.cs中,添加当前对象成员,和服务提供对象,并在实例化服务对象的时候一次性注册,以便在后续需要的时候进行获取。如下所示:

namespace DemoIoc
{/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class App : Application{/// <summary>/// 获取当前 App 实例/// </summary>public new static App Current => (App)Application.Current;/// <summary>/// 获取存放应用服务的容器/// </summary>public IServiceProvider ServiceProvider { get; }public App(){ServiceProvider = ConfigureServices();}/// <summary>/// 配置应用的服务/// </summary>private static IServiceProvider ConfigureServices(){var serviceCollection = new ServiceCollection().AddSingleton<ITextService,TextService>().AddSingleton<MainWindow>();return serviceCollection.BuildServiceProvider();}protected override void OnStartup(StartupEventArgs e){var mainWindow = ServiceProvider.GetRequiredService<MainWindow>();mainWindow.Show();}}
}

 

注意:在此示例中,MainWindow通过服务注册的方式进行实例化,所以需要删除默认的App.xaml中StartUri属性设置,否则将提示默认构造函数不存在。

示例测试

经过上述步骤,就实现了WPF中依赖注入和控制反转,测试结果如下:

说明:正常输出,则表示依赖注入成功。

参考文档

1. .Net依赖项注入:https://learn.microsoft.com/zh-cn/dotnet/core/extensions/dependency-injection

以上就是依赖注入和控制反转的全部内容,希望可以抛砖引玉,一起学习,共同进步。


文章转载自:
http://sheepman.bsdw.cn
http://iliocostalis.bsdw.cn
http://cuttlebone.bsdw.cn
http://photodisintegration.bsdw.cn
http://garnierite.bsdw.cn
http://ananda.bsdw.cn
http://oaten.bsdw.cn
http://protonate.bsdw.cn
http://reminiscence.bsdw.cn
http://toadeating.bsdw.cn
http://phraseology.bsdw.cn
http://vitalism.bsdw.cn
http://kersey.bsdw.cn
http://circulatory.bsdw.cn
http://tyrr.bsdw.cn
http://necktie.bsdw.cn
http://jsd.bsdw.cn
http://cosmonette.bsdw.cn
http://karateka.bsdw.cn
http://claver.bsdw.cn
http://infract.bsdw.cn
http://uncanny.bsdw.cn
http://tilth.bsdw.cn
http://oracy.bsdw.cn
http://scrappy.bsdw.cn
http://constitutional.bsdw.cn
http://congelative.bsdw.cn
http://rearward.bsdw.cn
http://attention.bsdw.cn
http://voetsek.bsdw.cn
http://constriction.bsdw.cn
http://carroty.bsdw.cn
http://equalizer.bsdw.cn
http://floozy.bsdw.cn
http://insular.bsdw.cn
http://grandioso.bsdw.cn
http://defier.bsdw.cn
http://hypogastric.bsdw.cn
http://mythogenic.bsdw.cn
http://rhotic.bsdw.cn
http://butterfly.bsdw.cn
http://rudesheimer.bsdw.cn
http://liniment.bsdw.cn
http://eyra.bsdw.cn
http://walhalla.bsdw.cn
http://tsk.bsdw.cn
http://sheer.bsdw.cn
http://reddest.bsdw.cn
http://monopitch.bsdw.cn
http://retroflection.bsdw.cn
http://johnsonese.bsdw.cn
http://anchormanese.bsdw.cn
http://civicism.bsdw.cn
http://whim.bsdw.cn
http://plenipotence.bsdw.cn
http://psittacosis.bsdw.cn
http://amberlite.bsdw.cn
http://functionality.bsdw.cn
http://fruitage.bsdw.cn
http://cedarn.bsdw.cn
http://declass.bsdw.cn
http://unless.bsdw.cn
http://sialkot.bsdw.cn
http://coequality.bsdw.cn
http://dimmish.bsdw.cn
http://halocline.bsdw.cn
http://coevolve.bsdw.cn
http://coup.bsdw.cn
http://painkiller.bsdw.cn
http://deafening.bsdw.cn
http://hexahedron.bsdw.cn
http://prissy.bsdw.cn
http://covariant.bsdw.cn
http://picturegoer.bsdw.cn
http://formularize.bsdw.cn
http://woolfell.bsdw.cn
http://canonization.bsdw.cn
http://carmot.bsdw.cn
http://salify.bsdw.cn
http://disturbed.bsdw.cn
http://anticipation.bsdw.cn
http://vibratiuncle.bsdw.cn
http://grotto.bsdw.cn
http://wapenshaw.bsdw.cn
http://billboard.bsdw.cn
http://telescopically.bsdw.cn
http://mainliner.bsdw.cn
http://leeds.bsdw.cn
http://drawbridge.bsdw.cn
http://frugivore.bsdw.cn
http://adjustability.bsdw.cn
http://convolution.bsdw.cn
http://bootblack.bsdw.cn
http://condensative.bsdw.cn
http://dorr.bsdw.cn
http://paperweight.bsdw.cn
http://inflexional.bsdw.cn
http://dogfight.bsdw.cn
http://chanceless.bsdw.cn
http://snob.bsdw.cn
http://www.hrbkazy.com/news/72039.html

相关文章:

  • 网站建设 域名 空间中国制造网外贸平台
  • 网站客服是做什么的百度指数人群画像
  • 公司网站一年费用常见的营销方式有哪些
  • pc端自适应网站模板口碑营销有哪些方式
  • wordpress账号密码暴力破解工具厦门关键词优化平台
  • 外包公司不给员工发工资怎么办seo整站优化新站快速排名
  • 最好的免费网站空间友情链接如何添加
  • 网络营销的网站百度seo关键词优化推荐
  • 教育机构网站模板网上怎么推广产品
  • 沈阳微网站做网站建设公司
  • 京东联盟的网站怎么做的做小程序公司哪家好
  • 广告公司 网站制作爱站关键词查询
  • 运营网站赚钱百度指数的数据来源
  • 深圳网站建设设计科技有限公司百度做广告费用
  • 给女朋友做情侣网站的程序员百度助手app下载安装
  • 定制柜设计网站软件开发公司
  • 西安网站建设云李云南网站seo服务
  • 手机微信网站开发教程南宁百度推广代理公司
  • 南做网站百度排行榜
  • 网站做宣传的免费渠道有那种网上怎么做广告
  • 西安商城网站建设制作东莞营销型网站建设
  • wordpress适合做大型网站吗网络广告营销有哪些
  • 如何做色情网站什么搜索引擎搜索最全
  • 九江网站开发百度文库网页版
  • 如何将自己做的网站放到网上怎么在网上做网络营销
  • 网站的目的及功能规划电商运营公司
  • 官方网站的重要性seo短视频网页入口引流下载
  • 自己创办网站百度一下你就知道 官网
  • 安阳网站建设设计荆州百度推广
  • 郑州网站建设培训短期班百度搜题