数据访问层

3

我们如何创建一个通用的数据访问层,可以被任何使用不同数据源提供程序或Web服务的ASP.NET应用程序使用?

我们可以为消费Web服务的应用程序创建数据访问层吗?


你可能正在寻找类似于提供程序工厂的东西。虽然我不了解这个主题的足够多,无法发布答案。这是我在ASP.Net课程中听到的一些内容。 - Matt R
6个回答

5

2
你有很多选择!:-)
你提到想要使用来自asp.net和web服务的数据访问层(DAL),没问题。
基本上,你需要确定一个基本设计,将DAL封装到自己的程序集中,可以从各种消费者中使用/引用它。
有许多方法可以做到这一点:
- 为你的表创建Linq-to-SQL映射,如果你正在使用SQL Server作为后端,并使用Linq-to-SQL实体和方法 - 创建一个存储库模式(对于每个"实体",你都有一个"EntityRepository"类,可用于检索实体,例如EntityReposity.GetByID(int id),或EntityRepository.GetByForeignKey(string fk)或其他) - 使用其他访问数据的方式(NHibernate,你自己的基于ADO.NET的映射器) - 你实际上也可以使用webservice调用作为你的数据提供者
你最大的挑战是定义一种标准的做事方式,并坚持下去。
看一些文章-也许它们会给你一个想法:

1
我建议不要使用TableAdapters。 - VoltaicShock

1

谢谢你的负评,非常感谢。也许可以留下一条评论说明原因? - Mitch Wheat

0

哇,有很多资源可供使用。最好的建议是找到一种你感觉舒适的模式,并在项目中坚持使用它,没有什么比在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等)。基础抽象类还要负责根据配置创建它的单例。请参阅有关提供程序模型的更多信息

否则,您可以查看这个类似的问题


0

看看使用以下接口:

IDbConnection IDbCommand IDbDataAdapter IdataReader


0

IRepository of T 是一种通用的良好方法。该接口应公开GetAll、GetByID、Insert、Delete和Submit方法。
但是,重要的是将业务逻辑从Repository类中分离出来,并将其放入自定义逻辑/服务类中。
此外,如果您在GetAll方法中返回IQueriable,在各种实现IRepository中常见的情况下,UI层也可以针对该IQueriable接口进行查询。但是,对象图的查询应留在Repository层中。关于此问题有很多辩论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接