日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

使用Xamarin.Forms的企业应用程序模式(电子书)--依赖注入

發(fā)布時(shí)間:2023/12/15 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Xamarin.Forms的企业应用程序模式(电子书)--依赖注入 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

通常,在實(shí)例化對(duì)象時(shí)調(diào)用類構(gòu)造函數(shù),并將對(duì)象需要的任何值作為參數(shù)傳遞給構(gòu)造函數(shù)。 這是依賴注入的一個(gè)例子,具體稱為構(gòu)造函數(shù)注入。 對(duì)象需要的依賴項(xiàng)被注入到構(gòu)造函數(shù)中。

通過將依賴項(xiàng)指定為接口類型,依賴注入可以使具體類型與依賴于這些類型的代碼進(jìn)行解耦。 它通常使用一個(gè)容器來存儲(chǔ)接口和抽象類型之間的注冊(cè)和映射列表,以及實(shí)現(xiàn)或擴(kuò)展這些類型的具體類型。

還有其他類型的依賴注入,如屬性設(shè)置器注入和方法調(diào)用注入,但它們不太常見。 因此,本章將僅關(guān)注使用依賴注入容器執(zhí)行構(gòu)造函數(shù)注入。

依賴注入簡(jiǎn)介

依賴注入是反轉(zhuǎn)控制(IoC)模式的專門版本,其中被反轉(zhuǎn)的關(guān)注點(diǎn)是獲得所需依賴關(guān)系的過程。 使用依賴注入,另一個(gè)類負(fù)責(zé)在運(yùn)行時(shí)將依賴關(guān)系注入對(duì)象。 以下代碼示例顯示了在使用依賴注入時(shí)ProfileViewModel類的結(jié)構(gòu):


點(diǎn)擊(此處)折疊或打開

  • public class ProfileViewModel : ViewModelBase
  • {
  • ????private IOrderService _orderService;

  • ????public ProfileViewModel(IOrderService orderService)
  • ????{
  • ????????_orderService = orderService;
  • ????}
  • ????...
  • }

  • ProfileViewModel構(gòu)造函數(shù)接收一個(gè)IOrderService實(shí)例作為參數(shù),由另一個(gè)類注入。 ProfileViewModel類中唯一的依賴關(guān)系在接口類型上。 因此,ProfileViewModel類對(duì)于負(fù)責(zé)實(shí)例化IOrderService對(duì)象的類沒有任何知識(shí)。 負(fù)責(zé)實(shí)例化IOrderService對(duì)象并將其插入到ProfileViewModel類中的類稱為依賴注入容器。

    依賴注入容器通過提供實(shí)例化類實(shí)例的功能并根據(jù)容器的配置來管理其使用壽命來減少對(duì)象之間的耦合。 在創(chuàng)建對(duì)象期間,容器將注入對(duì)象所需的任何依賴項(xiàng)。 如果這些依賴關(guān)系尚未創(chuàng)建,容器首先創(chuàng)建并解析它們的依賴關(guān)系。

    注意:依賴注入也可以使用工廠手動(dòng)實(shí)施。 但是,使用容器可以通過組裝掃描提供諸如生命周期管理和注冊(cè)等附加功能。

    使用依賴注入容器有幾個(gè)優(yōu)點(diǎn):

    • ?容器不需要一個(gè)類定位其依賴關(guān)系并管理其生命周期。
    • ?容器允許映射實(shí)現(xiàn)的依賴關(guān)系而不影響類。
    • ?通過允許依賴關(guān)系被嘲笑,容器便于測(cè)試。
    • ?通過允許將新類輕松添加到應(yīng)用程序中,容器增加了可維護(hù)性。

    在使用MVVM的Xamarin.Forms應(yīng)用程序的上下文中,依賴注入容器通常用于注冊(cè)和解析視圖模型,以及注冊(cè)服務(wù)并將其注入到視圖模型中。

    有許多依賴注入容器可用,eShopOnContainers移動(dòng)應(yīng)用程序使用Autofac來管理應(yīng)用程序中的視圖模型和服務(wù)類的實(shí)例化。 Autofac有助于構(gòu)建松散耦合的應(yīng)用程序,并提供依賴注入容器中常見的所有功能,包括注冊(cè)類型映射和對(duì)象實(shí)例的方法,解析對(duì)象,管理對(duì)象生命周期,以及將依賴對(duì)象注入到其解析的對(duì)象的構(gòu)造器中。 有關(guān)Autofac的更多信息,請(qǐng)參閱readthedocs.io上的Autofac

    在Autofac中,IContainer接口提供依賴注入容器。 圖3-1顯示了使用此容器時(shí)的依賴關(guān)系,它實(shí)例化IOrderService對(duì)象并將其注入到ProfileViewModel類中。

    ?

    圖3-1:使用依賴注入時(shí)的依賴關(guān)系

    在運(yùn)行時(shí),容器必須知道它應(yīng)該實(shí)例化的IOrderService接口的哪個(gè)實(shí)現(xiàn),然后才能實(shí)例化一個(gè)ProfileViewModel對(duì)象。 這涉及到:

    • ?容器決定如何實(shí)例化實(shí)現(xiàn)IOrderService接口的對(duì)象。 這被稱為注冊(cè)。
    • ?實(shí)例化實(shí)現(xiàn)IOrderService接口的對(duì)象的容器和ProfileViewModel對(duì)象。 這被稱為決議。

    最終,應(yīng)用程序?qū)⑼瓿墒褂肞rofileViewModel對(duì)象,它將可用于垃圾回收。 此時(shí),如果其他類不共享相同的實(shí)例,垃圾收集器應(yīng)該處理IOrderService實(shí)例。

    ?????提示:寫入容器不可知代碼。 始終嘗試編寫與容器無關(guān)的代碼,以將應(yīng)用與正在使用的特定依賴關(guān)系容器分離。

    注冊(cè)

    在將依賴關(guān)系注入到對(duì)象之前,必須首先向容器注冊(cè)依賴關(guān)系的類型。 注冊(cè)類型通常涉及將容器傳遞給實(shí)現(xiàn)接口的接口和具體類型。

    通過代碼在容器中注冊(cè)類型和對(duì)象有兩種方法:

    • ?使用容器注冊(cè)類型或映射。 當(dāng)需要時(shí),容器將構(gòu)建一個(gè)指定類型的實(shí)例。
    • ?將容器中的現(xiàn)有對(duì)象注冊(cè)為單例。 當(dāng)需要時(shí),容器將返回對(duì)現(xiàn)有對(duì)象的引用。

    ?????提示:依賴注射容器并不總是適合的。 依賴注入引入了對(duì)小應(yīng)用程序可能不合適或有用的額外的復(fù)雜性和要求。 如果類沒有任何依賴關(guān)系,或者不是其他類型的依賴關(guān)系,則將它放在容器中可能是沒有意義的。 另外,如果一個(gè)類具有一組依賴關(guān)系,并且永遠(yuǎn)不會(huì)改變,那么將它放在容器中可能是沒有意義的。

    需要依賴注入的類型的注冊(cè)應(yīng)該通過應(yīng)用程序中的單一方法執(zhí)行,并且應(yīng)該在應(yīng)用程序的生命周期早期調(diào)用此方法,以確保應(yīng)用程序知道其類之間的依賴關(guān)系。 在eShopOnContainers手機(jī)應(yīng)用程序中,這是由ViewModelLocator類執(zhí)行的,該類構(gòu)建了IContainer對(duì)象,并且是應(yīng)用程序中唯一持有該對(duì)象的引用的類。 以下代碼示例顯示了eShopOnContainers移動(dòng)應(yīng)用程序如何在ViewModelLocator類中聲明IContainer對(duì)象:


    點(diǎn)擊(此處)折疊或打開

  • private static IContainer _container;



  • 類型和實(shí)例在ViewModelLocator類中的RegisterDependencies方法中注冊(cè)。 這是通過首先創(chuàng)建一個(gè)ContainerBuilder實(shí)例來實(shí)現(xiàn)的,該實(shí)例在以下代碼示例中被演示:


    點(diǎn)擊(此處)折疊或打開

  • var builder = new ContainerBuilder();



  • 然后將類型和實(shí)例注冊(cè)到ContainerBuilder對(duì)象,并且以下代碼示例演示了最常見的類型注冊(cè)形式


    點(diǎn)擊(此處)折疊或打開

  • var builder = new ContainerBuilder();


  • 此處顯示的RegisterType方法將接口類型映射到具體類型。 它通知容器來實(shí)例化一個(gè)RequestProvider對(duì)象,當(dāng)它實(shí)例化一個(gè)需要通過構(gòu)造函數(shù)注入IRequestProvider的對(duì)象。

    也可以直接注冊(cè)具體類型,而不需要從接口類型映射,如下面的代碼示例所示:


    點(diǎn)擊(此處)折疊或打開

  • builder.RegisterType();



  • ProfileViewModel類型解析后,容器將注入其所需的依賴關(guān)系。

    Autofac還允許實(shí)例注冊(cè),其中容器負(fù)責(zé)維護(hù)對(duì)類型的單例實(shí)例的引用。 例如,以下代碼示例顯示了當(dāng)ProfileViewModel實(shí)例需要IOrderService實(shí)例時(shí),eShopOnContainers移動(dòng)應(yīng)用程序如何注冊(cè)具體類型:


    點(diǎn)擊(此處)折疊或打開

  • builder.RegisterType().As().SingleInstance();



  • 此處顯示的RegisterType方法將接口類型映射到具體類型。 SingleInstance方法配置注冊(cè),以便每個(gè)從屬對(duì)象接收相同的共享實(shí)例。 因此,只有一個(gè)OrderService實(shí)例將存在于容器中,該對(duì)象由需要通過構(gòu)造函數(shù)注入IOrderService的對(duì)象共享。

    實(shí)例注冊(cè)也可以使用RegisterInstance方法執(zhí)行,這在下面的代碼示例中被證明:


    點(diǎn)擊(此處)折疊或打開

  • builder.RegisterInstance(new OrderMockService()).As();



  • 這里顯示的RegisterInstance方法創(chuàng)建一個(gè)新的OrderMockService實(shí)例并將其注冊(cè)到容器。 因此,容器中只存在一個(gè)OrderMockService實(shí)例,該實(shí)例由需要通過構(gòu)造函數(shù)注入IOrderService的對(duì)象共享。

    按照類型和實(shí)例注冊(cè),必須構(gòu)建IContainer對(duì)象,這在以下代碼示例中進(jìn)行了說明:


    點(diǎn)擊(此處)折疊或打開

  • _container = builder.Build();



  • 在ContainerBuilder實(shí)例上調(diào)用Build方法構(gòu)建一個(gè)新的依賴關(guān)系注入容器,其中包含已經(jīng)創(chuàng)建的注冊(cè)。

    ????提示:將IContainer視為不可變的。 雖然Autofac提供了更新方法來更新現(xiàn)有容器中的注冊(cè),但應(yīng)盡可能避免調(diào)用此方法。 建造容器后,修改容器是有風(fēng)險(xiǎn)的,特別是在容器已被使用的情況下。有關(guān)詳細(xì)信息,請(qǐng)參閱在readthedocs.io上考慮容器為不變的

    解析度

    注冊(cè)一個(gè)類型后,可以將其解析或注入為依賴關(guān)系。 當(dāng)一個(gè)類型被解析并且容器需要?jiǎng)?chuàng)建一個(gè)新的實(shí)例時(shí),它會(huì)將任何依賴項(xiàng)注入實(shí)例。

    一般來說,當(dāng)一個(gè)類型被解決時(shí),三件事之一發(fā)生:

    1.?如果類型尚未注冊(cè),容器將引發(fā)異常。

    2.?如果類型已經(jīng)注冊(cè)為單例,容器返回單例實(shí)例。 如果這是第一次調(diào)用該類型,容器將在需要時(shí)創(chuàng)建它,并保留對(duì)它的引用。

    3.?如果類型未注冊(cè)為單例,容器返回一個(gè)新實(shí)例,并且不保留對(duì)它的引用。

    以下代碼示例顯示如何解決先前已注冊(cè)Autofac的RequestProvider類型:


    點(diǎn)擊(此處)折疊或打開

  • var requestProvider = _container.Resolve();



  • 在此示例中,要求Autofac解析IRequestProvider類型的具體類型以及任何依賴關(guān)系。 通常,當(dāng)需要特定類型的實(shí)例時(shí)調(diào)用Resolve方法。 有關(guān)控制已解析對(duì)象的生命周期的信息,請(qǐng)參閱管理已解決對(duì)象的生命周期

    以下代碼示例顯示了eShopOnContainers移動(dòng)應(yīng)用程序如何實(shí)例化查看模型類型及其依賴關(guān)系:


    點(diǎn)擊(此處)折疊或打開

  • var viewModel = _container.Resolve(viewModelType);



  • 在此示例中,要求Autofac解析所請(qǐng)求視圖模型的視圖模型類型,容器還將解析任何依賴關(guān)系。 解析ProfileViewModel類型時(shí),解析的依賴關(guān)系是一個(gè)IOrderService對(duì)象。 因此,Autofac首先構(gòu)造一個(gè)OrderService對(duì)象,然后將其傳遞給ProfileViewModel類的構(gòu)造函數(shù)。 有關(guān)eShopOnContainers移動(dòng)應(yīng)用程序如何構(gòu)建視圖模型并將其與視圖相關(guān)聯(lián)的更多信息,請(qǐng)參閱使用視圖模型定位器自動(dòng)創(chuàng)建視圖模型

    注意:使用容器注冊(cè)和解析類型具有性能成本,因?yàn)槿萜魇褂梅瓷鋪韯?chuàng)建每種類型,特別是如果為應(yīng)用程序中的每個(gè)頁面導(dǎo)航重建依賴關(guān)系。 如果有很多或很深的依賴,創(chuàng)造的成本可以顯著增加。

    管理已解決對(duì)象的使用壽命

    注冊(cè)類型后,Autofac的默認(rèn)行為是在每次解析類型時(shí)創(chuàng)建一個(gè)新的注冊(cè)類型實(shí)例,或者依賴機(jī)制將實(shí)例注入其他類時(shí)。 在這種情況下,容器不會(huì)保留對(duì)已解析對(duì)象的引用。 但是,注冊(cè)實(shí)例時(shí),Autofac的默認(rèn)行為是將對(duì)象的生命周期作為單例進(jìn)行管理。 因此,當(dāng)容器在范圍內(nèi)時(shí),該實(shí)例保留在范圍內(nèi),并且當(dāng)容器超出范圍并被垃圾回收時(shí),或者當(dāng)代碼明確地處置該容器時(shí),該實(shí)例將被保留。

    Autofac實(shí)例范圍可用于指定Autofac從注冊(cè)類型創(chuàng)建的對(duì)象的單例行為。 Autofac實(shí)例作用域管理由容器實(shí)例化的對(duì)象生命周期。 RegisterType方法的默認(rèn)實(shí)例范圍是InstancePerDependency作用域。 但是,SingleInstance范圍可以與RegisterType方法一起使用,以便容器在調(diào)用Resolve方法時(shí)創(chuàng)建或返回類型的單例實(shí)例。 以下代碼示例顯示了如何指示Autofac創(chuàng)建NavigationService類的單例實(shí)例:


    點(diǎn)擊(此處)折疊或打開

  • builder.RegisterType().As().SingleInstance();



  • INavigationService接口第一次解析后,容器將創(chuàng)建一個(gè)新的NavigationService對(duì)象,并保留對(duì)它的引用。 在INavigationService接口的任何后續(xù)分辨率上,容器返回對(duì)先前創(chuàng)建的NavigationService對(duì)象的引用。

    注意:當(dāng)容器被處理時(shí),SingleInstance scope將配置創(chuàng)建的對(duì)象。

    Autofac包含其他實(shí)例范圍。 有關(guān)更多信息,請(qǐng)參閱readthedocs.io上的實(shí)例范圍

    概要

    依賴注入可以使具體類型與依賴于這些類型的代碼進(jìn)行解耦。 它通常使用一個(gè)容器來存儲(chǔ)接口和抽象類型之間的注冊(cè)和映射列表,以及實(shí)現(xiàn)或擴(kuò)展這些類型的具體類型。

    Autofac有助于構(gòu)建松散耦合的應(yīng)用程序,并提供依賴注入容器中常見的所有功能,包括注冊(cè)類型映射和對(duì)象實(shí)例的方法,解析對(duì)象,管理對(duì)象生命周期以及將依賴對(duì)象注入到其解析的對(duì)象的構(gòu)造器中。

    總結(jié)

    以上是生活随笔為你收集整理的使用Xamarin.Forms的企业应用程序模式(电子书)--依赖注入的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。