[英]uwp with c# and mvvm how to do inversion of control (dependency injection)
所以我的大部分编程都是在 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 中那样做。 视图模型是如何以及在哪里实例化的,我如何将存储库注入到视图模型中; 如果几个视图模型需要我的一些存储库,我可以将相同的存储库实例注入不同的视图模型吗? 我希望能够测试我的视图模型,所以我希望能够灵活地处理我注入的内容。
对不起,我没有任何代码,这是因为我什至无法开始在 uwp 中使用 c# 和 mvvm 进行编码,而没有了解如何能够进行 IoC 并遵循 SOLID 原则
关于 UWP 中的 MVVM,可以参考文档。 文档中有示例,您可以查看实例化视图模型的位置。
您可以使用Microsoft.Extensions.DependencyInjection NuGet package 进行依赖注入。
请检查以下步骤: 1. 在 C# UWP 项目中创建 MVVM 架构。 2.Click Tools in menu, select the option NuGet Package Manager > Manage NuGet Package for Solution… > Browse , enter Microsoft.Extensions.DependencyInjection
in search box, install the package for your project. 3.创建Container
object,它维护所有可以在应用程序的任何地方解决的依赖关系。
//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
class和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
注入您的视图模型 class,例如MainViewModel
class。
public class MainViewModel
{
protected IMessageService MessageService { get; }
public string Message { get => MessageService.GetMessage(); }
public MainViewModel(IMessageService messageService)
{
MessageService = messageService;
……
}
……
}
7.Resolve MainViewModel
,并通过ActivatorUtilities
function向构造函数注入参数注入依赖。
//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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.