什么是Ioc
在软件工程中,控制反转(IoC)是一种设计原则,其中计算机程序的自定义编写部分从外部源(例如框架)接收控制流。术语“反转”是历史性的:与过程式编程相比,具有这种设计的软件架构“反转”了控制。在过程式编程中,程序的自定义代码调用可重用库来处理通用任务,但在控制反转的情况下,是外部源或框架调用自定义代码。
在传统编程中,业务逻辑的流程是由静态绑定到彼此的对象决定的。
以赋值ViewModel为例,例如我有一个MainWindowViewModel,需要绑定到MainWindow的DataContext上
1 public MainWindow() 2 { 3 this.InitializeComponent(); 4 5 MainWindowViewModel viewmodel = new MainWindowViewModel(); 6 this.DataContext = viewmodel ; 7 }
通过反转控制,流程取决于程序执行过程中建立的对象图(https://www.cnblogs.com/zhaotianff/p/17402238.html)。这种运行时绑定是通过依赖注入(Dependency Inject)或服务定位器(Service Locator)等机制实现的。
可以看到下面的代码,我们先构造一个Ser
///构建ServiceProvider(Service Locator)
1 private static IServiceProvider ConfigureServices() 2 { 3 var services = new ServiceCollection(); 4 5 //使用Dependency Inject 6 //注入ViewModel 7 services.AddTransient<MainWindowViewModel>(); 8 9 return services.BuildServiceProvider(); 10 }
此时我们可以通过ServiceLocator来获取ViewModel
1 public MainWindow() 2 { 3 this.InitializeComponent(); 4 this.DataContext = App.Current.Services.GetService<MainWindowViewModel>(); 5 }
CommunityToolkit.MVVM中的Ioc
在WPF MVVM模式中发时,使程序模块化,常用的一种形式就是Ioc(控件反转)。比较常见的就是是使用依赖注入(Dependency Inject, DI),它包括创建注入后台类的服务(即作为参数传递给ViewModel构造函数)——这使得使用这些服务的代码不依赖于这些服务的实现细节。在需要的地方注入,然后在后端代码可以使用这些功能。
CommunityToolkit.MVVM包不提供内置的Ioc框架,需要引用:Microsoft.Extensions.DependencyInjection包,它提供了一组功能齐全、功能强大的DI API,并作为一个易于设置和使用的IServiceProvider。
在后面的文章中,将会介绍这个包的使用方法。
Ioc和DI的区别
Ioc是一种设计原则 ,是一种思想 。
DI是一种实现方式,它可以注入后台类的服务到一个容器中,在需要使用的时候再取出来。也可以帮助我们将参数传递给构造函数。
在前面的示例代码中,我们注入了一个ViewModel
1 services.AddTransient<MainWindowViewModel>();
然后在需要使用的时候,再取出来
1 this.DataContext = App.Current.Services.GetService<MainWindowViewModel>();
如果我们需要将参数传递给构造函数,可以看到下面的示例代码:
以一个计算器工具为例
我们创建了一个CalculatorService类,用于实现计算器的各个逻辑。
1 public class CalculatorService 2 { 3 public int Add(int a,int b) 4 { 5 return a + b; 6 } 7 8 public int Sub(int a,int b) 9 { 10 return a - b; 11 } 12 }
标签:CommunityToolkit,Mvvm,int,反转,代码,ViewModel,Ioc,public From: https://www.cnblogs.com/zhaotianff/p/18515397