天天看點

使用Prism Library for WPF管理元件之間的依賴關系

背景  

  基于Prism庫的應用程式是複合應用程式,可能包含許多松散耦合的類型和服務。他們需要進行互動以提供内容并根據使用者操作接收通知。因為它們是松散耦合的,是以它們需要一種互相互動和通信的方式來提供所需的業務功能。為了将這些不同的部分組合在一起,基于Prism庫的應用程式依賴于依賴注入容器,依賴注入容器通過提供執行個體化類執行個體的工具并根據容器的配置管理其生命周期來減少對象之間的依賴關系。在對象建立期間,容器會将對象所需的所有依賴項注入其中。如果尚未建立這些依賴項,則容器首先建立并解析它們的依賴項。在某些情況下,容器本身被解析為依賴項,例如,當使用Unity應用程式塊(Unity)作為容器時,子產品會注入容器,是以可以使用該容器注冊其視圖和服務。

使用優勢

使用容器有幾個好處:

  • 容器不需要元件來定位其依賴關系或管理它們的生命周期。
  • 容器允許交換已實作的依賴項而不影響元件。
  • 容器通過允許模拟依賴項來促進可測試性。
  • 容器通過允許将新元件輕松添加到系統中來提高可維護性。

在基于Prism庫的應用程式的上下文中,容器具有特定的優點:

  • 容器在加載時将子產品依賴項注入子產品。
  • 容器用于注冊和解析視圖模型和視圖。
  • 容器可以建立視圖模型并注入視圖。
  • 容器注入組合服務,例如區域管理器和事件聚合器。
  • 容器用于注冊特定于子產品的服務,這些服務是具有子產品特定功能的服務。

使用步驟

  1 使用Unity容器注冊類型

public class OrderModule : IModule
{
    public void Initialize()
    {
        this.container.RegisterType<IOrdersRepository, OrdersRepository>(new ContainerControlledLifetimeManager());
        ...
    }
    ...
}
      

  在上面的代碼中我們向容器中注入了一個IOrdersRepository的具體類型和實作,這個在整個容器的生命周期内都可以被解析,下面我們來看看該怎樣去解析這個注入容器中的對象。

  2 解析容器中的注冊的類型

  通常,在解析類型時,會發生以下三種情況之一:

  • 如果尚未注冊該類型,則容器将引發異常。

  注意:某些容器(包括Unity)允許您解析尚未注冊的具體類型。

  • 如果類型已注冊為單例,則容器将傳回單例執行個體。如果這是第一次調用該類型,則容器會建立它并保留它以供将來調用。
  • 如果類型尚未注冊為單例,則容器将傳回新執行個體。

  注意:預設情況下,使用MEF注冊的類型是單例,容器包含對象的引用。在Unity中,預設情況下會傳回新的對象執行個體,并且容器不會維護對該對象的引用。

public OrdersEditorViewModel(IOrdersRepository ordersRepository, OrdersCommandProxy commandProxy)
{
    this.ordersRepository = ordersRepository;
    this.commandProxy     = commandProxy;

    // Create dummy order data.
    this.PopulateOrders();

    // Initialize a CollectionView for the underlying Orders collection.
    this.Orders = new ListCollectionView( _orders );
    // Track the current selection.
    this.Orders.CurrentChanged += SelectedOrderChanged;
    this.Orders.MoveCurrentTo(null);
}
      

  在上面的例子中我們可以看到隻要是在我們需要使用到的地方通過構造函數傳入對應的類型資訊這樣一來注入容器就可以自動為我們解析到之前注入到容器内部的類型資訊,當然還有一種方式就是通過屬性注入到目前類中去。是以這裡就涉及到注入依賴的兩種主要的方式,一種是通過構造函數注入,另外一種是通過屬性注入的方式,這個在使用的時候需要根據自己的需要進行靈活運用。