[英]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);
}
為什么我們需要注冊接口,如果沒有注冊那么真正的實現呢? 實施這一原則是否有任何好處。 這篇文章我跟隨。
如果您已經在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.