gpt4 book ai didi

c# - FreshMvvm 中的控制反转 (IOC)

转载 作者:太空狗 更新时间:2023-10-30 00:37:21 26 4
gpt4 key购买 nike

关于 IOC,我阅读了下面的定义和注册 interface ,我真的无法理解

We don’t need to include our own IOC container, FreshMvvm comes with a IOC container built-in. It’s using TinyIOC underneath, but with different naming to avoid conflicts.

与 FreshIOC 的接口(interface)注册,如果您看到此代码,在应用程序启动时进行此实现

public App()  
{
InitializeComponent();

//Interface rgistration with FreshIOC
FreshIOC.Container.Register<IContactRepository, ContactRepository>();
FreshIOC.Container.Register<IValidator, ContactValidator>();

//var mainPage = FreshPageModelResolver.ResolvePageModel<AddContactPageModel>();
//MainPage = new FreshNavigationContainer(mainPage);
}

为什么我们需要注册接口(interface),如果不注册那么它的真正实现是什么?实现这个原则有什么好处吗? This我正在关注的文章。

最佳答案

如果您在 Xamarin.Forms 中使用过 DependencySerices,那么您已经使用了大部分。从Xamarin.Forms的角度解释

假设您的 ContentPage 需要一个 Network 类来检查是否存在网络连接,传统的方法是使用 new关键字并获取实例,以便您可以调用其方法。

public MyContentPage : ContentPage
{
private Network network;
public MyContentPage()
{
//..
network = new Network();
}
}

public Network()
{
public bool HasConnectivity() { ... }
}

这没有错,但是如果 Network 类需要一个 Log 类在里面怎么办?而 MyContentPage 还需要 Log 类和 Dialog 类?这需要在所有其他 50 页中完成?依赖注入(inject)解决了这些问题以及更多问题!

您创建接口(interface)及其实现,然后将它们注册到容器中。然后容器为你解决所有的依赖关系!

public MyContentPage : ContentPage
{
private INetwork _network;
private IDialog _dialog;
public MyContentPage(INetwork network, IDialog dialog)
{
//..
_network = network;
_dialog = dialog;
}
}

public Network(ILog log)
{
public bool HasConnectivity() { ... }
}

如果您已经注册了所有依赖项,Container 将处理依赖关系图并为您解决它们。如果容器无法解析图形,可能是因为您没有注册或者可能是循环依赖,它会抛出异常。

起初这似乎完全没有必要,但随着您的应用程序的增长,MVVM 与 DI 的结合会变得更强大并且更容易开发。

我所解释的只是 DI 的一小部分,您可以在这个 awesome Martin Fowler post 中阅读有关 IoC 和 DI 的更多信息

关于c# - FreshMvvm 中的控制反转 (IOC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52531402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com