具有现有数据库的可测试 Asp.net MVC + Entity Framework 架构
Testable Asp.net MVC + Entity Framework architecture with an existing database
现在我想在现有数据库上使用 ASP.NET MVC 开发 Web 应用程序,我的目标是高可测试性。
如果我要在现有数据库上工作,我必须将 .edmx 文件添加到我的解决方案中的项目并使用它。我错了吗?
您能否为这种情况建议一种架构,包括通用存储库、工作模式单元和依赖项注入?我在谷歌上搜索了几个小时,但我刚刚找到了代码优先方法的示例。你知道我可以研究的文章或开源项目吗?
谢谢,
您可以使用 DDD、MVC 应用程序 (UI)、作为服务层的 WCF 等。您的 EDMX 文件可以生成其他基本的东西,只要对 T4 有一点了解。但是,您需要阅读很多关于该模式的内容并尝试自己实现。请记住,EF Database First 只是 一种方法 一种技术 的数据访问解决方案,请尝试查看 Code First 实现并适应 Model First 方法.
If I will work on an existing db, I have to add an .edmx file to a project in my solution and work with that. Am I wrong about that?
是的,当您生成 edmx 时,您将生成包含数据属性的部分 classes(即:public 部分 class Car {...})。您必须在自己生成的部分 class 项目中添加自己的业务规则(public 部分 class 汽车 {...})。
您也可以摆脱 edmx,只保留数据 classes,以防您希望数据库根据您的应用程序数据模型发展。在这种情况下,我会删除 'partial' 关键字,然后将生成的 classes 移动到项目中。可以在应用程序启动时自动迁移数据库(添加或删除列、表)。
对于 EF6 中的依赖注入,您不能让一个对象引用另一个对象的接口,或者这种关系会被 entity framework 忽略。这是一个真正缺少的功能(与 NHibernate 相比),但它将包含在 EF7 中。
Dbcontext 实现工作单元模式,但您可以实现自己的模式,例如,如果您使用多个数据库,用于分布式事务。
Now I want to develop a web application using ASP.NET MVC on an existing database and I'm aiming high testability. [..]Can you suggest an architecture for this case including generic repository, unit of work patterns and dependency injection?
这几乎矛盾。如果您已经有一个数据库,那么您就会遇到问题,因为一切都将由现有的数据库模式而不是实际用例驱动。从技术上讲,您想要的是重写应用程序以便进行测试,但我认为您的意思是可维护,同时保留现有数据。
您的应用程序需求的简单或复杂程度并不重要。如果它是一个 CRUD 应用程序,即您从用户那里获取数据,对其进行验证,然后将其放入数据库中,然后进行一些查询,那么事情就非常简单了。
您采用每个用例(添加数据、按条件获取数据等)并为其编写测试。您不需要存储库、工作单元等。您可以直接使用 EF(如果您真的想首先使用 ORM)。不用担心模拟事情,您的应用程序不再是数据库的 UI,您可以直接使用带有数据库的 EF 进行测试。
如果CRUD然后KISS。你不需要架构,不要浪费你的时间,不要让你的生活复杂化。
如果您的应用程序对业务对象(不仅仅是验证器,它们代表概念和领域流程)建模,它会随着时间的推移而发展,它使用特定于业务的语言,那么情况就不同了。
然而,这将是扩展这个 post 的方式(老实说,我 高度怀疑 怀疑你有这种应用程序)因为它意味着去DDD 路线,这意味着在 编写任何代码之前,您必须了解很多概念和模式。。
现在我想在现有数据库上使用 ASP.NET MVC 开发 Web 应用程序,我的目标是高可测试性。
如果我要在现有数据库上工作,我必须将 .edmx 文件添加到我的解决方案中的项目并使用它。我错了吗?
您能否为这种情况建议一种架构,包括通用存储库、工作模式单元和依赖项注入?我在谷歌上搜索了几个小时,但我刚刚找到了代码优先方法的示例。你知道我可以研究的文章或开源项目吗?
谢谢,
您可以使用 DDD、MVC 应用程序 (UI)、作为服务层的 WCF 等。您的 EDMX 文件可以生成其他基本的东西,只要对 T4 有一点了解。但是,您需要阅读很多关于该模式的内容并尝试自己实现。请记住,EF Database First 只是 一种方法 一种技术 的数据访问解决方案,请尝试查看 Code First 实现并适应 Model First 方法.
If I will work on an existing db, I have to add an .edmx file to a project in my solution and work with that. Am I wrong about that?
是的,当您生成 edmx 时,您将生成包含数据属性的部分 classes(即:public 部分 class Car {...})。您必须在自己生成的部分 class 项目中添加自己的业务规则(public 部分 class 汽车 {...})。
您也可以摆脱 edmx,只保留数据 classes,以防您希望数据库根据您的应用程序数据模型发展。在这种情况下,我会删除 'partial' 关键字,然后将生成的 classes 移动到项目中。可以在应用程序启动时自动迁移数据库(添加或删除列、表)。
对于 EF6 中的依赖注入,您不能让一个对象引用另一个对象的接口,或者这种关系会被 entity framework 忽略。这是一个真正缺少的功能(与 NHibernate 相比),但它将包含在 EF7 中。
Dbcontext 实现工作单元模式,但您可以实现自己的模式,例如,如果您使用多个数据库,用于分布式事务。
Now I want to develop a web application using ASP.NET MVC on an existing database and I'm aiming high testability. [..]Can you suggest an architecture for this case including generic repository, unit of work patterns and dependency injection?
这几乎矛盾。如果您已经有一个数据库,那么您就会遇到问题,因为一切都将由现有的数据库模式而不是实际用例驱动。从技术上讲,您想要的是重写应用程序以便进行测试,但我认为您的意思是可维护,同时保留现有数据。
您的应用程序需求的简单或复杂程度并不重要。如果它是一个 CRUD 应用程序,即您从用户那里获取数据,对其进行验证,然后将其放入数据库中,然后进行一些查询,那么事情就非常简单了。
您采用每个用例(添加数据、按条件获取数据等)并为其编写测试。您不需要存储库、工作单元等。您可以直接使用 EF(如果您真的想首先使用 ORM)。不用担心模拟事情,您的应用程序不再是数据库的 UI,您可以直接使用带有数据库的 EF 进行测试。
如果CRUD然后KISS。你不需要架构,不要浪费你的时间,不要让你的生活复杂化。
如果您的应用程序对业务对象(不仅仅是验证器,它们代表概念和领域流程)建模,它会随着时间的推移而发展,它使用特定于业务的语言,那么情况就不同了。
然而,这将是扩展这个 post 的方式(老实说,我 高度怀疑 怀疑你有这种应用程序)因为它意味着去DDD 路线,这意味着在 编写任何代码之前,您必须了解很多概念和模式。。