C#:Services访问运行sql语句的dataprovider类 – 正确的方法?

这是一种常见的和/或好的方法吗?

在我的ViewModel(Wpf)或Presenter(WinForms)中,我这样做:

ICustomerService customerService = MyService.GetService(); ICustomerList customerList = customerService.GetCustomers(); 

CustomerService类如下所示:

 public class CustomerService : ICustomerService { public ICustomerList GetCustomers() { return _customerDataProvider.GetCustomers(); } } public class CustomerDataProvider() { public ICustomerList GetCustomers() { // Open SQL connection, // get back a SqlDataReader and iterate it // in the loop write all data into a ICustomer object // add the ICustomer object to the ICustomerList // return ICustomerList object... } } 

从数据库中检索数据是应用程序的管道。 你自己写的管道越少,你的工作效率就越高。

我通常直接在客户端访问LINQ:

  sp_GetCustomersResult customers; using (var db = new DbDataContext(ConnectionString)) customers = db.sp_GetCustomers(); 

这非常有效,让我专注于添加客户价值而不是数据库访问层。

自从扩展方法可用以来,我没有发现为业务类或自定义集合声明接口的重要价值。 我会让GetCustomers返回IEnumerable

如果您计划广泛使用业务对象,那么您应该考虑使用对象/关系映射器,如NHibernate 。 或者使用LINQ2SQL或Entity Framework来减少必须编写的重复管道代码的数量。