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来减少必须编写的重复管道代码的数量。