【问题标题】:ASP.NET Repository design patternASP.NET 存储库设计模式
【发布时间】:2014-04-16 02:02:19
【问题描述】:

这是我为我的 ASP.NET Web 应用程序采用的当前设计模式,我见过有人使用存储库,但我不了解存储库设计模式的实现。

谁能指出我如何在我的设计中实现存储库模式?还有,如果我在我的案例中实现一个存储库,我将获得什么样的好处。

另外,我应该在我的设计中实现哪些好的接口?

客户类 (Customer.cs)

public class Customer
{
    public int CustomerID { get; set; }
    public string Name { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
}

DBManager 类 (DBManager.cs)

public class DBManager
{
    private const string connectionString = "some connection string";

    public static IEnumerable<Customer> getAllCustomers()
    {
        List<Customer> cust = new List<Customer>();

        try
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();

                string cmdText = "SELECT * FROM Customer";
                SqlCommand comm = new SqlCommand(cmdText, conn);
                SqlDataReader dr = comm.ExecuteReader();

                while (dr.Read())
                {
                    cust.Add(new Customer 
                    {
                        CustomerID = int.Parse((string)dr["customerID"]),
                        Name = (string)dr["name"],
                        Address1 = (string)dr["address1"],
                        Address2 = (string)dr["address2"]
                    });
                }
            }
        }
        catch (SqlException e)
        {
            throw e;
        }

        return cust;
    }
}

索引页面代码隐藏 (index.aspx.cs)

public partial class WebForm1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        IEnumerable<Customer> cust = DBManager.getAllCustomers();

        // some codes to display IEnum customers in page
    }
}

【问题讨论】:

    标签: c# asp.net web repository


    【解决方案1】:

    在您的情况下,您的 DBManager 本身非常接近存储库模式。在域驱动设计的世界中,通常会为您找到域的每个聚合根创建一个存储库,如 Martin Fowler 的解释。

    http://martinfowler.com/bliki/DDD_Aggregate.html

    对于您在域中处理的每个实体/聚合根,您将创建一个存储库来处理 CRUD 操作(创建、读取、更新和删除)。因此,在您的情况下,您可以拥有一个客户存储库。

    编辑:好处是数据的接触方式和工作方式的实现是从你的代码的其余部分中抽象出来的。然后,您可以简单地调用存储库中的方法以使代码更易于阅读。此外,如果您将存储库实现为接口,则可以开始使用依赖注入之类的东西,这将使您的代码更易于维护、可测试和其他 *ables。 ;-)

    C# 中的典型 Repository 接口看起来像这样(显然,根据您的需要可能会有所不同。

    public interface ICustomerRepository : IDisposable
    {
        IEnumerable<Customer> GetCustomers();
        Customer GetCustomerByID(int customerId);
        void InsertCustomer(Customer customer);
        void DeleteCustomer(int customerId);
        void UpdateCustomer(Customer customer);
        void Save();
    }
    

    可以在 MSDN 上找到了解更多信息的好资源。该示例使用 MVC 和实体框架,但显然可以针对您的应用程序进行调整。

    http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

    【讨论】:

    • 我试图理解 Save() 方法。如果假设我调用 InsertCustomer,客户将在执行结束时插入到我的数据库中,为什么我需要 Save() 方法?
    • 这取决于你的实现。在许多情况下,存储库模式与工作单元 (UoW) 模式之类的东西一起设置。在这些情况下,对于您的数据存储(在本例中为数据库)上的每个操作,您将在 UoW 中创建一个连接实例并将该连接传递到您的存储库中。一旦存储库中的操作完成,UoW 就会在每个存储库上调用 Save() 方法。如果某些事情不起作用,它就无法提交事务,它也可以执行回滚。但在您指出的情况下,可以省略。
    猜你喜欢
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    相关资源
    最近更新 更多