我们如何创建一个通用的数据访问层,可以被任何使用不同数据源提供程序或Web服务的ASP.NET应用程序使用?
我们可以为消费Web服务的应用程序创建数据访问层吗?
哇,有很多资源可供使用。最好的建议是找到一种你感觉舒适的模式,并在项目中坚持使用它,没有什么比在3/4的过程中改变主意更糟糕的了。
我发现并喜欢使用的一种模式是存储库或提供程序模式。存储库模式只是确保您可以标准访问存储库,例如您的商店目录或CMS系统。您创建一个接口,在我的情况下公开IQueryable对象或数据模型集合,这些对象或数据模型只是标准的c#类,没有额外的花哨POCO(Plain Old CLR Objects)。
public interface ICMSRepository {
IQueryable<ContentSection> GetContentSections();
void SaveContentSection(ContentSection obj);
}
然后只需为不同的提供程序实现接口,例如 LINQ to SQL 上下文,确保返回 POCO 对象作为可查询对象。这样做的好处是,您可以轻松地从 IQueryable 中创建扩展方法以轻松获取所需内容。例如:
public static IQueryable<ContentSection> WithID(this IQueryable<ContentSection> qry, int ID) {
return from c in qry select c;
}
//Allow you to chain repository and filter to delay SQL execution
ICMSRepository _rep = new SqlCMSRepository();
var sec = _rep.GetContentSections().WithID(1).SingleDefault();
使用接口方式的好处在于能够在运行时测试、模拟或注入所需的存储依赖。
另一种我使用过并且在ASP.Net框架中经常使用的方法是提供程序模型。这种方式类似,但你需要创建一个单例抽象类来代替接口,并在抽象类之上实现特定的存储访问手段(如XML、平面文件、SQL、MySql等)。基础抽象类还要负责根据配置创建它的单例。请参阅有关提供程序模型的更多信息。
否则,您可以查看这个类似的问题。
看看使用以下接口:
IDbConnection IDbCommand IDbDataAdapter IdataReader
IRepository of T 是一种通用的良好方法。该接口应公开GetAll、GetByID、Insert、Delete和Submit方法。
但是,重要的是将业务逻辑从Repository类中分离出来,并将其放入自定义逻辑/服务类中。
此外,如果您在GetAll方法中返回IQueriable,在各种实现IRepository中常见的情况下,UI层也可以针对该IQueriable接口进行查询。但是,对象图的查询应留在Repository层中。关于此问题有很多辩论。