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

时间:2010-11-15 16:23:04

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

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

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

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

我确实理解这是一个很好的做法,并使TDD看起来也很棒。但我的问题是:

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

3 个答案:

答案 0 :(得分:4)

我明白你的意思:你声明要通过存储库检索的大多数POCO类看起来很像你的ORM框架自动生成的类。因此,将这些数据访问类重用为业务对象是很诱人的。

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

答案 1 :(得分:3)

如果使用Entity Framework 4,则可以从数据库自动生成POCO对象。 (http://blogs.msdn.com/b/adonet/archive/2010/01/25/walkthrough-poco-template-for-the-entity-framework.aspx

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

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

我建议您阅读本书的第二版,这是纯金,并使用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

答案 2 :(得分:2)

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