簡體   English   中英

分層體系結構中的存儲庫模式

[英]Repository Pattern in Layered Architecture

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

我創建了MYSQLRepository (DataLayer)

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();

    }
}

現在我的問題是,在表示層,我希望這樣做

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的例子,它似乎在那里運行良好。

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

感謝Soni的幫助

最好將IoC統一到構造函數注入,這將刪除不必要的層的引用。

我認為你忽略了存儲庫模式如此強大的重點和原因。 在您的表示層中調用它可能看起來很奇怪,但想象該頁面需要使用不同的數據源。 您可以通過以下調用輕松地將其交換出來: orderBL orderBL = new OrderBL(new OracleRepository());

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

您的BL可以在需要時實例化DL。 如果您有交叉方法調用,其中需要在數據中執行多個操作,那么請使用外觀層來放置業務對象。 無論哪種方式,您都不需要直接引用表示層中的數據層存儲庫。 如果它讓您感覺更好,請將任何Model類(例如Order)拉出到單獨的“Models”項目中。

為避免直接調用數據層,您可以調用業務層中的函數來實例化存儲庫。 您的業​​務層可以處理其余部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM