【问题标题】:How to avoid declaring database fields twice, once in database, once in a repository/model?如何避免两次声明数据库字段,一次在数据库中,一次在存储库/模型中?
【发布时间】:2022-02-23 17:07:45
【问题描述】:

我最近开始阅读Pro ASP.NET MVC Framework

author 谈论创建存储库,以及使用接口设置快速自动化测试,这听起来很棒。

但它带来的问题是必须两次声明数据库中每个表的所有字段:一次在实际数据库中,一次在 C# 代码中,而不是使用 ORM 自动生成 C# 数据访问类.

我明白这是一个很好的做法,并且启用了看起来也很棒的 TDD。但我的问题是:

是否有任何解决方法必须两次声明字段:在数据库和 C# 代码中?我不能使用自动生成 C# 代码但仍允许我执行 TDD 而无需在 C# 中手动创建所有业务逻辑并为每个表创建存储库(以及假存储库)的东西吗?

【问题讨论】:

  • 是什么让你觉得业务逻辑必须声明两次?
  • "...不得不为自己声明数据库的所有业务逻辑两次:一次在实际数据库中..." 等等,什么? BL 没有进入 DB,是什么让你认为它在这里出现?
  • 我的意思是你两次声明数据库中每个表的所有字段,一次在数据库本身中,一次在 C# 代码中,这可以通过使用 LINQ To SQL 的自动映射之类的东西来避免类
  • 编辑了您的标题,因为我认为您没有询问有关存储库模式的任何内容,只是一般而言的数据访问。在数据库和代码之间复制或映射字段一直是一个问题,我认为您只是要求自动化工具选项。存储库模式实际上并不是说您需要有一个单独的业务和数据访问模型,事实上 ORMS 旨在支持和处理映射中的各种转换。 MS 的实现通过自动生成鼓励持久性而不是域模型,但这当然不是必需的

标签: c# asp.net-mvc tdd separation-of-concerns


【解决方案1】:

我理解您的意思:您声明已由存储库检索的大多数 POCO 类看起来很像由您的 ORM 框架自动生成的类。因此,将这些数据访问类当作业务对象一样重用是很有诱惑力的。

但根据我的经验,我在业务逻辑中需要的数据很少完全像数据访问类一样。通常我要么需要来自数据对象的某些特定数据子集,要么需要通过将几个数据对象连接在一起而产生的某种数据组合。如果我愿意再花两分钟实际构建我想到的 POCO,并创建一个接口来表示我计划使用的存储库方法,我会发现代码最终在我需要时更容易重构改变业务逻辑。

【讨论】:

  • 对此+1。创建存储库需要一点工作,但是将其滑动到界面后面会使事情变得如此简单。轻松换出业务逻辑和简单的 TDD :)
【解决方案2】:

如果您使用 Entity Framework 4,您可以从数据库中自动生成 POCO 对象。 (Link)

然后您可以实现一个通用的 IRepository 及其通用的 SqlRepository,这将允许您为所有对象拥有一个存储库。这在这里解释:http://msdn.microsoft.com/en-us/ff714955.aspx

这是实现您想要的一种简洁的方法:您只需在数据库中声明一次对象,自动生成它们,并且可以使用您的存储库轻松访问它们(此外您可以进行 IoC 和单元测试:))

我建议您阅读本书的第二版,它是纯金的,并且更新了 MVC 2 中引入的新功能 http://www.amazon.com/ASP-NET-Framework-Second-Experts-Voice/dp/1430228865/ref=sr_1_1?s=books&ie=UTF8&qid=1289851862&sr=1-1

您还应该阅读 MVC3 中引入的新功能,现在在 RC 中(有一个新的视图引擎非常有用)http://weblogs.asp.net/scottgu/archive/2010/11/09/announcing-the-asp-net-mvc-3-release-candidate.aspx

【讨论】:

  • 是的,我读过一些关于 razor 的文章,它看起来很棒,但由于我对书中的大多数概念都很陌生(除了东西
  • +1 这个答案。我在亚马逊上读过你链接的那本书,我也认为它是纯金的。这真的是一个流畅的阅读,并很好地解释了一切。比 wrox 在第一章中的书呆子晚餐废话要好得多,直到您在论坛中筛选这本书并找到其他最终想出解决方法的沮丧读者时才编译。
【解决方案3】:

您没有两次声明业务逻辑。只是这个业务逻辑被抽象在一个接口后面,在这个接口的实现中,你可以做任何你想做的事情:访问数据库,从文件系统中读取,从 Web 地址聚合信息,......这个接口允许更弱的耦合控制器和存储库的实现以及其他简化了 TDD。将其视为控制者与企业之间的合同。

【讨论】:

    猜你喜欢
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 2017-05-24
    • 2017-06-09
    相关资源
    最近更新 更多