数据访问层

时间:2009-03-25 06:08:46

标签: c# asp.net

我们如何创建一个可以由任何使用不同数据源提供者或web服务的asp.net应用程序使用的通用数据访问层?

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

6 个答案:

答案 0 :(得分:5)

您可以查看存储库模式。存储库是一个外观,它将持久化对象呈现为内存中的集合。无论您选择哪种提供者获取数据都隐藏在Repository界面后面。

IRepository with LINQ to SQL

Code Project Tutorial

A sample by Fredrik Kalseth

答案 1 :(得分:2)

你有很多选择! :-)

您提到要使用asp.net和Web服务中的数据访问层(DAL)。没问题。

基本上,你需要弄清楚的是你想要遵循的基本设计,并将DAL封装到自己的程序集中,可以从各种消费者中使用/引用。

有很多方法可以做到这一点:

  • 如果您使用SQL Server作为后端,则为表创建Linq-to-SQL映射,并使用Linq-to-SQL实体和方法
  • 创建一个存储库模式(对于每个“实体”,您有一个“EntityRepository”类,可用于检索实体,例如EntityReposity.GetByID(int id),或EntityRepository.GetByForeignKey(string fk)或其他< / LI>
  • 使用一些其他方法访问数据(NHibernate,您自己的基于ADO.NET的映射器)
  • 您实际上也可以将webservice调用用作数据提供者

您面临的最大挑战是确定一种标准的做事方式,并坚持下去。

查看一些文章 - 也许他们会给你一个想法:

答案 2 :(得分:1)

尝试www.asp.net上的教程:

DataAccess

答案 3 :(得分:0)

哇,那里有很多资源。最好的建议就是找到一个你觉得舒服的模式并坚持下去进行项目,没有什么比改变主意更好的了。

我发现并喜欢使用的是Repository或Provider模式。存储库模式只是确保您具有对存储库的标准访问权限,例如商店目录或CMS系统。你创建了一个接口,在我的情况下暴露了IQueryable的集合,对象或数据模型只是标准的c#类,现在有额外的绒毛POCO(普通旧CLR对象)。

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();

使用Interface方法的好处是能够在运行时测试和模拟它或依赖注入您喜欢的存储。

我在ASP.Net框架中使用的另一种方法很多是Provider模型。这是类似的,除了您创建单例抽象类的接口,然后您在抽象类之上的实现将定义存储访问方式(XML,平面文件,SQL,MySql等)。基本抽象类也将基于配置创建它的单例。请参阅提供者模型上的more info

否则你可以查看this similar question

答案 4 :(得分:0)

T的IR是一般的好方法。此接口应公开GetAll,GetByID,Insert,Delete和Submit方法 但是,将业务逻辑保留在Repository类之外并将其置于自定义逻辑/服务类中非常重要 此外,如果您在GetAll方法中返回IQueriable,您可以在各种IRepository实现中看到,UI层也可以查询该IQueriable接口。但是查询对象图应该保留在Repository层中。围绕这个问题有很多争论。

答案 5 :(得分:0)

使用接口:

的IDbConnection IDbCommand的 IDbDataAdapter IDataReader的