这是我用于 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; }
}
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
}
}
答案 0 :(得分:5)
在您的情况下,您的DBManager本身非常靠近存储库模式。在域驱动设计领域,通常会为您找到域的每个聚合根创建一个存储库,如Martin Fowler的解释所示。
http://martinfowler.com/bliki/DDD_Aggregate.html
对于您在域中处理的每个Entity / Aggregate根,您将创建一个可以处理CRUD操作(创建,读取,更新和删除)的存储库。因此,在您的情况下,您可以拥有一个客户存储库。
编辑:好处是从代码的其余部分中抽象出如何触摸数据以及如何工作的实现。然后,您只需调用存储库中的方法即可使代码更易于阅读。此外,如果您将Repository实现为接口,则可以开始使用Dependency Injection之类的东西,这将使您的代码更易于维护,可测试以及其他* ables。 ; - )
C#中的典型存储库界面看起来像这样(显然可能会有所不同,具体取决于您的需求。
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和实体框架,但显然可以针对您的应用程序进行调整。