簡體   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