C# 如何避免两次声明数据库字段,一次在数据库中,一次在存储库/模型中?

C# 如何避免两次声明数据库字段,一次在数据库中,一次在存储库/模型中?,c#,asp.net-mvc,tdd,separation-of-concerns,C#,Asp.net Mvc,Tdd,Separation Of Concerns,我最近开始阅读 这本书讲述了如何创建存储库,以及如何使用接口来设置快速自动化测试,这听起来很棒 但它带来了一个问题:必须两次声明数据库中每个表的所有字段:一次在实际数据库中,一次在C代码中,而不是用ORM自动生成C数据访问类 我知道这是一个很好的实践,并且使TDD看起来也很棒。但我的问题是: 是否有任何解决方法需要声明两次字段:在数据库和C代码中?我能不能使用一些自动生成C代码但仍然允许我进行TDD的东西,而不必手动创建C中的所有业务逻辑,并为每个表创建一个存储库(也是一个假的存储库?您不会两次

我最近开始阅读

这本书讲述了如何创建存储库,以及如何使用接口来设置快速自动化测试,这听起来很棒

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

我知道这是一个很好的实践,并且使TDD看起来也很棒。但我的问题是:


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

您不会两次声明业务逻辑。只是这个业务逻辑被抽象到一个接口后面,在这个接口的实现中,您可以做任何您想做的事情:点击数据库,从文件系统读取,从web地址聚合信息。。。此接口允许控制器和存储库实现之间的耦合减弱,以及其他简化TDD的接口。可以将其视为控制器和业务之间的契约。

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


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

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

然后您可以实现一个通用IRepository及其通用SqlRepository,这将允许您拥有一个用于所有对象的存储库。这里解释如下:

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

我建议您阅读这本书的第二版,这本书是纯金版的,更新了MVC2中引入的新特性


您还应该了解MVC3中引入的新功能,该功能现在在RC中(有一个新的视图引擎非常有用)

是什么让您认为必须两次声明业务逻辑?“…必须两次声明数据库的所有业务逻辑:一次在实际数据库中…”等等,什么?BL不在数据库中,你怎么会认为它在这里呢?我的意思是你在数据库中声明每个表的所有字段两次,一次在数据库中,一次在C#code中,这可以通过使用LINQ到SQL的自动映射类之类的东西来避免,因为我认为您不会询问任何关于存储库模式的问题,只是一般的数据访问。在db和代码之间复制或映射字段一直是一个问题,我认为您只是需要自动化工具选项。repository模式并没有说您需要一个单独的业务和数据访问模型,事实上,ORM是用来支持和处理映射中的各种转换的。MS的实现通过自动生成鼓励持久性而不是域模型,但这肯定不是必需的。是的,我读了一些关于razor的书,它看起来很棒,但因为我对书中的大多数概念都是新手(除了这个答案的stuff+1之外,几乎所有的东西都有。我读了你在亚马逊上链接到的那本书,我也认为它是纯金的。这本书读起来真的很流畅,而且解释得很好。比第一章中wrox关于书呆子晚餐垃圾的那本书要好得多,那本书甚至在你筛选论坛之前都不会编译。)预订并找到其他沮丧的读者,他们最终找到了解决方法。+1到此为止。创建存储库只需一点工作,但将其滑到界面后面会使事情变得非常简单。轻松交换业务逻辑和轻松TDD:)