2011-09-01 50 views
2

我已經閱讀了很多關於存儲庫模式的文章,並且有一些問題。 我想在ASP.NET 4.0應用程序中實現這一點。 該體系結構是一個具有表示層,業務層和數據層的分層體系結構。 從這篇文章中,http://www.primaryobjects.com/CMS/Article108.aspx分層架構中的存儲庫模式

我創建了MYSQLRepository(數據層)

public class MySQLRepository:IOrderRepository 
{ 
    public List<Order> GetOrders() 
    { 

     List<Order> orders = new List<Order>(); 
     orders.Add(new Order(1,"A")); 
     orders.Add(new Order(2,"B")); 

     return orders; 
    } 
} 

我的業務層看起來像這樣

public class OrderBL 
{ 
    IOrderRepository orderrep; 
    public OrderBL(IOrderRepository repository) 
    { 
     orderrep = repository; 

    } 

    public List<Order> GetOrders() 
    { 
     return orderrep.GetOrders(); 

    } 
} 

現在我的問題是,在表示層,我m預計要做到這一點

protected void Page_Load(object sender, EventArgs e) 
{ 
    OrderBL orderBL = new OrderBL(new MySQLRepository()); 
    List<Order> orders = orderBL.GetOrders(); 

    foreach (Order order in orders) 
    { 
     Response.Write(order.OrderId.ToString() + ". " + order.OrderNo + "<br>"); 
    } 

} 

爲了做到這一點,我必須在表示層中引用我的DataLayer。這不是錯的嗎?理想情況下,我只想引用我的業務層。 在我的實現中出現錯誤,或者它不是實現該模式的正確位置。我見過很多使用ASP.NET MVC的例子,它似乎在那裏工作得很好。

另外,我真的需要依賴注入嗎?

感謝您的幫助 瑞裏

+0

@Eranga,感謝您的編輯。想知道如何做到這一點 – hangar18

+0

選擇代碼塊並點擊'{}' – Eranga

回答

7

這是更好地unilize國際奧委會得到構造器注入,這將消除不必要的層的引用。

+0

謝謝。我唯一的問題是它是一個非常簡單的應用程序。不知道我是否想在針頭使用時使用一把劍! – hangar18

+1

我認爲,如果你沒有發現存儲庫過度殺傷,那麼ioc就不會那麼好。嘗試Catle Windsor,Unity或StructureMap,它們很容易設置。 – Dima

0

爲避免直接調用數據層,可以調用業務層中的函數來安裝存儲庫。您的業​​務層可以處理其餘的事情。

+1

謝謝。不確定模式是否太誇張。我確信必須有一種更簡單的方法將我的應用程序從底層數據源中抽象出來。 – hangar18

1

我想你錯過了這個觀點,以及存儲庫模式如此強大的原因。在您的表示層中調用它可能看起來很奇怪,但想象那個頁面需要使用不同的數據源。你可以像撥打電話一樣輕鬆地將其換掉: orderBL orderBL = new OrderBL(new OracleRepository());

+0

是的,我對模式的使用有點困惑。但我的觀點是,我不希望UI調用我的數據層。我想通過我的業務層。 – hangar18

1

另一種方法是,您不要傳遞存儲庫引用。

您的BL可以在需要時實例化DL。如果您在需要在數據中發生多個操作的情況下進行交叉方法調用,則使用Facade圖層來放置業務對象。無論哪種方式,您都不需要直接引用表示層中的數據層存儲庫。如果它讓你感覺更好,將任何Model類(例如Order)拖放到單獨的「Models」項目中。