繁体   English   中英

FreshMvvm中的控制反转(IOC)

[英]Inversion of Control (IOC) in FreshMvvm

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

我们不需要包含我们自己的IOC容器,FreshMvvm内置了一个IOC容器。 它在下面使用TinyIOC,但具有不同的命名以避免冲突。

与FreshIOC的接口注册 ,如果你看到这个代码,在启动应用程序时实现这个实现

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);  
} 

为什么我们需要注册接口,如果没有注册那么真正的实现呢? 实施这一原则是否有任何好处。 这篇文章我跟随。

内置的IOC容器是TinyIOC的抽象。

要通过FreshMvvm抽象在TinyIOC容器中注册一个类型:

FreshIOC.Container.Register<ISomeInterface, SomeImplementation>();

以后使用它:

// Gets object of type SomeImplementation
var instanceOfConcreteType = FreshIOC.Container.Resolve<ISomeInterface>();

这是一篇讨论IOC 什么的帖子: 什么是控制反转?

如果您已经在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页中完成吗? 依赖注入解决了这些以及更多问题!

您创建接口及其实现,然后使用容器注册它们。 然后容器为您解析所有依赖项!

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将负责依赖关系图并为您解决它们。 如果Container无法解析图形,可能是因为您没有注册或者可能是循环依赖,它会抛出异常。

这似乎完全没必要,但随着你的应用程序的增长,MVVM加上DI可以更强大,更容易开发。

我所解释的只是DI的一小部分,你可以在这个很棒的Martin Fowler帖子中阅读更多关于IoC和DI 的内容

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM