[英]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.