繁体   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