分层体系结构中的存储库模式

时间:2011-09-01 03:47:59

标签: c# asp.net repository-pattern webforms

我已经阅读了很多关于存储库模式的文章并且有一些问题。 我正在尝试在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的例子,它似乎在那里很好用。

另外,我真的需要依赖注入吗?

感谢您的帮助 超声处理

4 个答案:

答案 0 :(得分:7)

最好将IoC统一以获取构造函数注入,这将删除不必要的层的引用。

答案 1 :(得分:1)

我认为您忽略了存储库模式如此强大的重点和原因。在您的表示层中调用它可能看起来很奇怪,但想象该页面需要使用不同的数据源。您可以通过以下调用轻松地将其换出:               orderBL orderBL = new OrderBL(new OracleRepository());

答案 2 :(得分:1)

这里的另一个替代方法是不要传递存储库引用。

您的BL可以在需要时实例化DL。如果您有交叉方法调用,其中需要在数据中执行多个操作,那么请使用外观层来放置业务对象。无论哪种方式,您都不需要直接引用表示层中的数据层存储库。如果它让您感觉更好,请将您的任何Model类(例如Order)拉出到单独的“Models”项目中。

答案 3 :(得分:0)

为避免直接调用数据层,您可以调用业务层中的函数来实例化存储库。您的业​​务层可以处理剩下的事情。