代码之家  ›  专栏  ›  技术社区  ›  Nathan Ridley

在使用LINQtoSQL时,如何抽象出持久性代码?

  •  6
  • Nathan Ridley  · 技术社区  · 15 年前

    我喜欢LINQtoSQL,但它一直困扰着我,在使用它时,我的存储库代码由LINQtoSQL框架生成,因此与SQLServer数据库紧密耦合。

    你们中是否有人以抽象、松散耦合的方式使用LINQtoSQL?如果是,您是如何解决保持代码数据库独立的问题的?

    4 回复  |  直到 15 年前
        1
  •  3
  •   Marc Gravell    15 年前

    • IFooRepository -使用生成的dbml对象和一些POCO模型类定义可用的方法
    • FooRepository -了解数据上下文的实现

    我的存储库方法不公开LINQ概念,例如 IQueryable<T> Expression<...> ,因为它们是 leaky abstractions ; 其他实现将以不同的方式工作(例如,EF支持两者的不同方面)。

    此外,我已经开始将大多数关联属性标记为内部属性,并且只在DAL查询期间使用它们(在OO工作期间没有这么多)。

    Pragmatic LINQ .

        2
  •  1
  •   Mouk    15 年前

    您可以使用类似于中使用的方法 NerdsDinner . 这个项目使用DATA上下文作为数据库的网关,并围绕它构建一个存储库。

    这种存储库模式添加了一些条件、筛选器、排序命令。。。根据被调用的方法执行etc,然后向调用方返回IQuerable,让门打开以进行进一步修改。

    实际上,在围绕NHibernate会话构建存储库时,您的做法几乎相同。

    例如,如果您决定用NHibernate替换LinqtoSql,您只需在存储库中查询一个Linq会话,而不是datacontext会话。当然,您需要使用LinqtoSql自动添加的属性来完成分部类。

        3
  •  0
  •   andy    15 年前

    嘿,内森,问得好。

    我的方法是编写一个DAL,其中包含一系列通用方法,这些方法使用反射来完成任何必要的操作。

    在这些情况下,一旦方法接收到一个对象,比如“产品”,它就可以在内部独立于您的ORM/数据访问技术来做任何它想做的事情。如果需要,它可以根据一些参数和对象的反射编写一个SQL字符串。

    然而

    问题实际上是实体本身。即使您抽象了用于检索数据的方法,您仍然会在业务逻辑中一直使用这些实体。

    我觉得,目前,这正是我准备要面对的事情,因为重新编写我自己的断开连接的实体似乎是一座我还不准备跨越的桥梁,只是因为这似乎是很多不必要的工作。。。

    不过,我很想看看其他人是如何解决这个问题的。

        4
  •  -1
  •   David    15 年前

    上面Mouk提到了NerdsBanner中的存储库模式,这里还有一个如何快速设置的教程:

    http://www.asp.net/learn/mvc/tutorial-10-cs.aspx

    这是一个很好的小系列教程,在书呆子晚宴之前发布。这里的概念也可以在传统的asp.net web表单应用程序中设置。

    http://www.asp.net/learn/mvc/tutorial-16-cs.aspx