【问题标题】:ASP.NET MVC2 Data Access LayerASP.NET MVC2 数据访问层
【发布时间】:2011-02-14 10:34:06
【问题描述】:

对于中小型项目,我试图找出拥有域层和数据访问层的“理想”方式。我对耦合的看法更倾向于领域模型不应该与数据库层紧密耦合的观点,换句话说,数据访问层实际上不应该知道有关领域对象的任何信息。

我一直在研究 Linq-to-sql,它想使用它自己创建的模型,因此它最终耦合得非常紧密。虽然我喜欢你在代码中使用 linq-to-sql 的方式,但我真的不喜欢它想要创建自己的域对象的方式。

我应该考虑哪些替代方案?我尝试使用 NHibernate,但我不喜欢我必须用来查询和获取不同对象的方式。老实说,我喜欢你使用 linq 的语法和方式,我只是不希望它与域对象如此紧密地耦合。

【问题讨论】:

    标签: c# asp.net-mvc-2 data-access-layer


    【解决方案1】:

    如果您不希望您的域与数据库紧密耦合,那么您的选择非常多:

    1. NHibernate
    2. 实体框架

    您已经发现 Linq 2 Sql 从您的数据库层生成代码,所以这是不可能的。 Subsonic 和 LLBLGen Pro 也是如此(我相信,如果我错了,请纠正我)。 Entity Framework 过去也属于这种情况,但第 4 版已提供“代码优先”支持,因此它绝对是一种选择。

    NHibernate 和 Entity Framework 都支持 LINQ 查询,尽管 Entity Framework 的 LINQ 支持据说优于 NHibernate。我同意 HQL 和 Criteria 查询不如 LINQ 优雅,但我感觉 NHibernate 的 LINQ 支持将在 3.0 版中得到极大改进。

    【讨论】:

    • NHibernate 和实体框架之间的性能差异是什么?我知道当我使用 NHibernate 一段时间时,它的启动时间很慢,我不是特别喜欢。实体框架在这方面是否相似?
    • 实例化 NHibernate SessionFactory 是一项昂贵的操作,但对于大多数应用程序来说可以忽略不计,因为每个应用程序只需要实例化一次。在 ASP.NET MVC 2 应用程序中,您可能会在 Application_Start 上实例化一个 SessionFactory 并将其存储为单例。从那时起,来自任何用户的每个后续 Web 请求都将使用相同的 SessionFactory 实例,这不会导致相同的性能损失。我有一篇博客文章展示了如何做到这一点:kevinwilliampang.com/2010/04/06/…
    • 对于实体框架,我没有太多使用经验。我玩过它一些,它似乎没有与 NHibernate 相同的加载问题。但是,正如我在之前的评论中所说,这个加载时间对于 99.9% 的 Web 应用程序来说几乎可以忽略不计,因为它在每个应用程序生命周期中只会发生一次。
    • 啊,我没有意识到你可以用 NHibernate 做到这一点,在我玩弄它的时候,我从来没有真正设置过这样的东西。非常有趣的东西。我现在可能不得不考虑回到 NHibernate。我在您的博客上看到您使用了 Fluent NHibernate,除了不编写 xml 配置文件之外,Fluent 和 vanilla NHibernate 之间是否有任何区别我需要关注自己?
    • 不。 Fluent NHibernate 的功能非常完整,并且使映射变得不那么乏味。如果您需要为特定映射返回 XML 格式,它也支持该格式,因此您永远不会陷入困境。
    【解决方案2】:

    我发布了一个类似问题的答案,可能会有所帮助。我可以在这里重复一遍,但我想我会在那里为您指出答案,因为我会建议使用相同类型的存储库模式来解耦您的数据。

    MVC + Repository Pattern - Still depends on Data Model?

    【讨论】:

    • 这是一个可能的解决方案,但它否定了 NHibernate 为您提供的所有不错的功能(例如 1 级/2 级缓存、延迟加载/急切加载等),同时要求您编写一个生成的类和你自己的类之间有很多映射代码(诚然,可以使用 AutoMapper 之类的东西来简化)。我会说在这种方法上使用 NHibernate 以避免自己编写这么多管道代码。
    【解决方案3】:

    您可以使用 LINQ to SQL 创建表示数据实体的类型。这些几乎只是代表数据库中表的类。在 MVC 项目中,您应该使用这些向业务层提供数据,您可以从该层开始定义业务实体,然后(在我看来非常重要)定义您的表示模型。

    【讨论】:

      【解决方案4】:

      我知道你不是很喜欢 NHibernate,但如果你想再看看它,请查看 http://sharparchitecture.net/。他们在布局项目模板同时正确分离关注点方面做得非常出色。

      【讨论】:

        猜你喜欢
        • 2013-06-21
        • 2011-12-10
        • 1970-01-01
        • 2012-06-21
        • 1970-01-01
        • 2011-07-20
        • 1970-01-01
        • 2014-07-25
        • 1970-01-01
        相关资源
        最近更新 更多