uwp 与 c# 和 mvvm 如何做控制反转(依赖注入)
Posted
技术标签:
【中文标题】uwp 与 c# 和 mvvm 如何做控制反转(依赖注入)【英文标题】:uwp with c# and mvvm how to do inversion of control (dependency injection) 【发布时间】:2021-04-22 22:40:29 【问题描述】:所以我的大部分编程都是在 java 中完成的,我使用了大量的 IoC 和 DPI,通过从 main 方法向新创建对象的构造函数注入所有必要的依赖项。 所以我将所有存储库注入服务,然后将服务注入控制器。这样,我只创建了每个依赖项的一个实例,并将它们注入到需要它们的地方。
在java中我这样做:
public class Main
public static void main(String[] args)
InterfaceRepository<Booking> bookingInterface = new BookingRepository();
InterfaceRepository<User> userInterface = new UserRepository();
InterfaceBookingService interfaceBookingService = new BookingService(bookingInterface, userInterface);
InterfaceUserService interfaceUserService = new UserService(userInterface);
BookingController bookingController = new BookingController(interfaceBookingService, interfaceUserService);
UserController userController = new UserController(interfaceUserService)
在 uwp 中,我完全不知道如何像在 java 中那样做。视图模型的实例化方式和位置以及如何将存储库注入视图模型;如果几个视图模型需要我的一些存储库,我可以将存储库的相同实例注入不同的视图模型吗?我希望能够测试我的视图模型,所以我也希望能够灵活地处理我注入的内容。
对不起,我没有任何代码,这是因为我什至无法在不了解如何进行 IoC 并遵循 S.O.L.I.D. 的情况下开始使用 c# 和 mvvm 在 uwp 中进行编码。原则
【问题讨论】:
【参考方案1】:关于 UWP 中的 MVVM,可以参考document。文档中有示例,您可以查看视图模型的实例。
您可以使用 Microsoft.Extensions.DependencyInjection NuGet 包进行依赖注入。
请检查以下步骤:
1.在 C# UWP 项目中创建 MVVM 架构。
2.点击菜单中的工具,选择选项NuGet Package Manager > Manage NuGet Package for Solution... > Browse,在搜索框中输入Microsoft.Extensions.DependencyInjection
,为您的安装包项目。
3.创建Container
对象,该对象维护可以在应用程序中的任何位置解析的所有依赖项。
//App.xaml.cs
public App()
this.InitializeComponent();
this.Suspending += OnSuspending;
Container = ConfigureDependencyInjection();
public IServiceProvider Container get;
IServiceProvider ConfigureDependencyInjection()
var serviceCollection = new ServiceCollection();
serviceCollection.AddTransient<IMessageService, MessageService>();
return serviceCollection.BuildServiceProvider();
4.创建MessageService
类和IMessageService
接口。
//Add a new class to create the interface and class
public interface IMessageService
string GetMessage();
public class MessageService : IMessageService
public string GetMessage()
return "Hello from Message Service & Dependency Injection";
5.注册MessageService
到Container
(参考步骤3中的代码)。
6.将MessageService
注入到你的viewmodel类中,比如MainViewModel
类。
public class MainViewModel
protected IMessageService MessageService get;
public string Message get => MessageService.GetMessage();
public MainViewModel(IMessageService messageService)
MessageService = messageService;
……
……
7.解析MainViewModel
,通过ActivatorUtilities
函数向构造函数注入参数注入依赖。
//MainPage.xaml.cs
public MainPage()
this.InitializeComponent();
var container = ((App)App.Current).Container;
DataContext = ActivatorUtilities.GetServiceOrCreateInstance(container, typeof(MainViewModel));
8.在页面中显示消息。
//MainPage.xaml
<Grid>
<TextBlock Text="Binding Message" Margin="10" FontSize="20"/>
</Grid>
【讨论】:
以上是关于uwp 与 c# 和 mvvm 如何做控制反转(依赖注入)的主要内容,如果未能解决你的问题,请参考以下文章