2017-10-04 60 views
2

我想在实体框架和Dapper之间创建抽象层。在运行时,我可以选择实体框架或Dapper,或者我也将它们两个都包含在内。我知道,我可以使用接口如何在各种ORM(实体框架和Dapper)之间创建抽象层?

public IORM{ 
    Save(); 
    Delete(); 
    //other ORM functions 
} 

public EntityFramework : IORM{ 
    public Save(){ 
    SaveChanges(); 
    } 
    public Delete(){ 
    Remove(); 
    } 
} 


public Dapper: IORM{ 
    public Save(){ 
    //save code goes here 
    } 
    public Delete(){ 
    //delete code goes here 
    } 

但是,这是基本的操作和不知道如何在.NET 2.0的核心方法CofigureServices()配置。

是不同的ORM之间的抽象建议?如果是的话, 在.net 核心2.0中实现Entity framework和Dapper之间的抽象层?

+1

除非应用程序需求需要同时使用sql和nosql数据库(某种混合使用情况),否则我不会建议抽象ORM的。因此,从当前和未来的需求角度评估用例,如果您的应用程序和整个应用程序完全适用于某种类型的数据库,则无需进行抽象。 –

+0

请参阅使用Dapper + Dapper Extensions实现Repository和UnitOfWork的示例代码。 stackoverflow.com/a/45460483/5779732; stackoverflow.com/a/45029588/5779732 –

+0

我想说,在不同的ORM之间创建抽象层并不是特别有用。这需要相当多的努力,投资回报似乎不大可能。毕竟,你为什么要做这个开关? – GlennSills

回答

4

它始终是最好保持分离的担忧。但是,一个完整的ORM可以隐藏在一个接口定义之后是一种幻想。 ORM的运行时行为可能会对整个应用程序产生相当大的影响,并且需要很多工作才能“交换”ORM。保持这种能力的原因并不多。 你的动机是什么?

当然,抽象具体的ORM工作是一个好主意。具体的例子真的取决于你的整体架构,但要提一些要点:

  • 保持模型和控制器的持久性东西(属性,依赖关系)。
  • 应用存储库模式并将存储库接口参数注入到应用程序服务中。这样,您可以隐藏ORM的具体查询/写入操作。
  • 应用工作单元模式,并使用Web框架基础结构为每个请求透明地处理工作单元。这样,您可以隐藏ORM的具体事务处理操作。