ASP.NET存储库设计模式

Inn*_*Dan 0 c# asp.net repository web

这是我为ASP.NET Web应用程序使用的当前设计模式,我见过人们使用存储库,但我没有得到存储库设计模式的实现.

任何人都可以指出我如何在我的设计中实现存储库模式?如果我在MY CASE中实现存储库,我将获得什么样的好处.

还有,我应该在设计中实现哪些接口的好用?

客户类(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; }
}
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

索引页代码隐藏(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
    }
}
Run Code Online (Sandbox Code Playgroud)

jen*_*ndp 5

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

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

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

编辑:好处是从代码的其余部分中抽象出如何触摸数据以及如何工作的实现.然后,您只需调用存储库中的方法即可使代码更易于阅读.此外,如果您将Repository实现为接口,则可以开始使用依赖注入之类的东西,这将使您的代码更易于维护,可测试以及其他*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();
}
Run Code Online (Sandbox Code Playgroud)

有关这方面的更多信息的良好资源可以在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净MVC应用程序

  • 这取决于您的实施.在许多情况下,存储库模式与诸如工作单元(UoW)模式之类的东西一起设置.在这些情况下,对于数据存储上的每个操作(在本例中为DB),您将在UoW中创建连接实例,并将该连接传递到存储库.一旦在存储库中完成了操作,UoW就会在每个上调用Save()方法.如果某些东西不起作用,它就无法提交事务,它也可以进行回滚.但正如你所指出的那样,它可以被排除在外. (2认同)