2014-01-21 78 views
3

我正在尝试创建一个允许您切换多个数据源的系统,例如:从实体框架切换到Dapper。我试图找到最好的方法来做到这一点。具有多个数据源的数据层体系结构

目前我对不同的数据层有不同的项目,例如, Entity Framework的Data.EF,Dapper的Data.Dapper。我已经使用了数据库方法,但是当它创建模型时,所生成的信息被耦合在一起并且不容易重构,例如,模型分离。

我有一个项目叫做模型,这个模块包含域和视图模型,我正在考虑创建Data.Core并遵循存储库模式。但是,这样做会增加一个额外的层,所以我会有Presentation/Business/Repository/Data。

我想知道这种方法的最佳结构。我是否也应该采用代码优先的方式来创建我的数据库?这有助于分离关注并改善抽象。这是一个相当大的应用程序,所以要正确的结构是必不可少的。

+0

感谢您的意见。真的很好的建议,并很高兴能走在正确的轨道。 –

回答

1

我认为你的方法是正确的。这些天我会说Presentation/business/repository/data是非常标准的。

我想说的是使用POCO的代码优先方法是当今业界的首选方案。我建议开始创建一个包含您的POCO数据结构的项目,并将其从任何逻辑中取出。这样做的好处是您的对象更自然地模拟域。如果你从一个以数据库为中心的方法开始,问题是,如果你不小心,你可能会以更接近于SQL关系数据库而不是真实模型的对象结束。这在.net的第一个版本中非常明显,它鼓励使用与数据库紧密结合的数据集,并且这往往会导致在业务层中使用问题。

如果需要,您可以在存储库层中的业务对象和数据库对象之间进行任何复杂的映射。如果需要,您可以使用代理和/或工作单元。

0

我会建议你创建你的域对象,使用代码优先方法,也适用于存储库模式

3

我建议您保理数据接口至通过您的实体或到仓库界面模型基建项目。 (我认为后者是创建Data.Core项目背后的基本原理。)

然后每个数据源将实现相同的一组接口,并且即使动态使用依赖注入,您也可以在它们之间轻松切换。

例如,使用存储库:

Model 
    \_ Entities 
     Entity 
    \_ Repositories 
     IEntityRepository  

Data.EF  
    EntityRepository : Model.IEntityRepository 

Data.Dapper 
    EntityRepository : Model.IEntityRepository 

然后在你的业务,你不需要甚至引用Data.EFData.Dapper:你可以用IEntityRepository工作,并有一个参考动态注入。

0

是的存储库模式确实带来了一个额外的层。看看这篇文章了解更多详细信息Difference between Repository and Service Layer?

RE:代码优先方法的创建数据库

不要紧,有多大你的应用程序,它是你打算什么其他问题使用数据库。如果这个数据库只是这个应用程序的存储库,那么使用代码优先就好,因为您只是存储代码对象。但是,如果您将此数据库用作应用程序之间的集成点,那么您可能希望将数据库分开设计为应用程序模型。

相关问题