我正在尝试创建一个允许您切换多个数据源的系统,例如从实体框架切换到Dapper。我试图找到最好的方法来做到这一点。
目前我有不同的项目用于不同的数据层,例如实体框架为Data.EF
,Dapper为Data.Dapper
。我使用了数据库方法但是当它创建模型时,生成的信息被耦合在一起并且不容易重构,例如,分离模型。
我有一个名为 models 的项目,它包含域和视图模型,我正在考虑创建Data.Core
并遵循存储库模式。但是,这样做会增加一个额外的层,所以我会有Presentation / Business / Repository / Data。
我想知道这种方法的最佳结构。我是否也应该采用代码优先的方法来创建我的数据库?这有助于分离关注点并改善抽象。这是一个非常大的应用程序,因此正确的结构是必不可少的。
答案 0 :(得分:3)
我建议您通过实体的存储库接口或基础架构项目将数据接口分解为模型。 (我认为后者是你创建Data.Core
项目背后的理由。)
然后,每个数据源将实现完全相同的接口集,您可以轻松地在它们之间切换,甚至可以使用依赖注入动态地进行切换。
例如,使用存储库:
Model
\_ Entities
Entity
\_ Repositories
IEntityRepository
Data.EF
EntityRepository : Model.IEntityRepository
Data.Dapper
EntityRepository : Model.IEntityRepository
然后,在您的商家中,您甚至不需要引用Data.EF
或Data.Dapper
:您可以使用IEntityRepository
并动态注入该引用。
答案 1 :(得分:1)
我认为你的方法是正确的。我说现在演示/商业/存储库/数据非常标准。
我认为使用POCO的代码优先方法是当今业界的首选方案。我建议开始创建一个包含POCO数据结构的项目,其中包含任何逻辑并从那里获取。这样做的好处是您的对象可以更自然地为域建模。如果您从以数据库为中心的方法开始,问题在于,如果您不小心,您可能会使用更类似于SQL关系数据库的对象而不是真实模型。这在.net的第一个版本中非常明显,鼓励使用与数据库紧密耦合的数据集,这通常会导致在业务层中使用问题。
如果需要,您可以在业务对象和存储库层中的db对象之间执行任何复杂的映射。如果需要,您可以使用代理和/或工作单元。
答案 2 :(得分:0)
我建议您创建域对象,使用代码优先方法并应用存储库模式
答案 3 :(得分:0)
是的,存储库模式确实带来了额外的层。有关详细信息Difference between Repository and Service Layer?
,请查看此帖子RE:代码优先创建数据库的方法
您的应用程序有多大并不重要,这是您打算如何使用数据库的问题。如果这个数据库只是这个应用程序的存储库,那么使用代码优先就可以了,因为您只是存储代码对象。但是,如果您将此数据库用作应用程序之间的集成点,那么您可能希望将数据库单独设计为应用程序模型。