2013-05-16 22 views
1

我正在使用依賴注入。說我有一個OrderService類是這樣的:在依賴注入中聲明門面類

public class OrderService{ 
    public OrderService(
     IOrderValidator validator 
     , IOrderRepository repository 
     , IOrderNotificator notificator){ 
     //assign global fields 
    } 

    public void SubmitOrder(Order ord){ 
     if(validator.IsOrderValid(ord)){ 
      repository.InsertNew(ord); 
      notificator.Notify(ord); 
     } 
    } 
} 

現在我不知道創建例如TypeAOrderService一個門面類,如OrderService繼承,與如在構造函數中聲明組件:

public class TypeAOrderService : OrderService{ 
    public TypeAOrderService() : base(
     new OrderValidator(), 
     new OrderRepository(), 
     new OrderNotificator()) { } 
} 

(請注意,注入組件的複雜性的實現在這裏並不重要,但adapter pattern也可以被替換爲繼承)。

這裏可能會有缺點,因爲我們沒有在組合根目錄中定義依賴關係。不過,我想知道在某些情況下是否可以接受。尤其是在framework component的時候,通過訪問DI容器並自己解決它,使用框架相當奇怪。

更新:

正如評論所說,目前我不使用任何IOC容器。我的觀點是,在Framework中使用IOC容器很奇怪,因爲這意味着每個應用程序使用框架都需要使用IOC容器。如果我的觀點不對,請隨時糾正我。

我所指的框架示例是System.Windows.Forms.Form,其中我沒有使用任何IOC容器並且不確定依賴關係。

+0

你好Fendy,你想只使用依賴注入,或者你也嘗試使用IOC容器。恕我直言,你正在採取的方法將工作,但是如果你使用IOC容器(如windsor),我認爲你最好爲你的組件創建一個安裝程序。也許這篇文章可以幫助你http://kozmic.net/2010/08/10/ioc-patterns-ndash-partitioning-registration/ – Marwijn

+0

@Marwijn目前我不使用任何IOC容器。我的觀點是,在Framework中使用IOC容器是很奇怪的,因爲這意味着每個應用程序使用該框架都需要使用IOC容器(同時請說明我的觀點是否錯誤)。我正在引用框架示例,如'System.Windows.Forms.Form' – Fendy

+0

如果你不想使用IOC容器,並且你似乎有一個合法的理由,我認爲你的方法是好的。在這種情況下,OrderValidator,OrderRepository和OrderNotificator甚至可能是您的Assembly的私有類。 – Marwijn

回答

2

關於是否使用IoC,我認爲在框架庫中使用IoC是很好的。它只是意味着你的框架有自己的Container和Composition Root,它們完全隱藏在它的任何消費者身上。您可以創建易於使用的Facade類。像這樣:

public class OrderServiceFacade 
{ 
    private readonly IOrderService OrderService; 

    public class OrderServiceFacade() 
    { 
     this.OrderService = ContainerWrapper.Container.Resolve<IOrderService>(); 
    } 

    public void SubmitOrder(Order ord) { 
     OrderService.SubmitOrder(ord); 
    } 
} 

其中ContainerWrapper是你的Composition Root,一個圍繞DI Container的包裝。

internal class ContainerWrapper 
{ 
    private Container _Container; 
    public Container Container 
    { 
     if(_Container == null) 
     { 
      //initialize it 
     } 
     return _Container; 
    } 
} 

當然,您需要OrderService和TypeAOrderService從一個新的IOrderService接口繼承。這也將您的TypeAOrderService從您的OrderService中分離出來,因爲它可以在其構造函數中使用接口,而不是直接實例化特定的實現。如果實際上需要TypeAOrderService來調用OrderService上的方法,則可以使用Decorator模式並使TypeAOrderService將IOrderService作爲附加依賴項。

+0

感謝您指出'框架擁有自己的Container和Composition Root'。 – Fendy