c#依赖注入和控制反转的书籍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#依赖注入和控制反转的书籍相关的知识,希望对你有一定的参考价值。

参考技术A 是《现代CCS指南》。
1、依赖注入(DependencyInjection:DI):程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。通俗来讲,就是把有依赖关系的类放到容器中,然后在我们需要这些类时,容器自动解析出这些类的实例。依赖注入最大的好处时实现类的解耦,利于程序拓展、单元测试、自动化模拟测试等。
2、控制反转(InversionofControl:IOC):控制反转只是一个概念,也就是将创建对象实例的控制权(原本是程序员)从代码控制权剥离到IOC容器中控制。

uwp 与 c# 和 mvvm 如何做控制反转(依赖注入)

【中文标题】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.注册MessageServiceContainer(参考步骤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>

【讨论】:

以上是关于c#依赖注入和控制反转的书籍的主要内容,如果未能解决你的问题,请参考以下文章

uwp 与 c# 和 mvvm 如何做控制反转(依赖注入)

C#依赖注入控制反转IOC实现详解

“依赖注入”,“控制反转”是指啥?

深层理解Spring 控制反转和依赖注入,这一篇文够了

控制反转(IOC)和依赖注入(DI)的区别

spring依赖注入,和控制反转。用自己的话说是怎么说的。最好能够用代码来解释