c# - 如何在各种ORM( Entity Framework 和Dapper)之间创建抽象层?

标签 c# entity-framework dapper abstraction asp.net-core-2.0

我想在 Entity Framework 和 Dapper 之间创建抽象层。在运行时我可以选择 Entity Framework 或 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 core 2.0中配置 CofigureServices() 方法。

Is abstractions between different ORMs advisable? If yes how to implement abstract layer between Entity framework and Dapper in .net core 2.0?

最佳答案

始终建议将关注点分开。但这是一种幻想,认为一个完整的 ORM 可以隐藏在一个接口(interface)定义后面。 ORM 的运行时行为可能会对整个应用程序产生相当大的影响,并且需要大量工作才能“交换”ORM。维持这种能力的充分理由并不多。 您这样做的动机是什么?

当然,抽象具体的 ORM 工作是一个好主意。具体示例实际上取决于您的整体架构,但要提一下几点:

  • 将持久性内容(属性、依赖项)保留在模型和 Controller 之外。
  • 应用存储库模式并将存储库接口(interface)参数注入(inject)到您的应用程序服务中。这样,您就可以隐藏 ORM 的具体查询/写入操作。
  • 应用工作单元模式并使用 Web 框架基础设施按请求透明地处理工作单元。这样,您就可以隐藏 ORM 的具体事务处理操作。

关于c# - 如何在各种ORM( Entity Framework 和Dapper)之间创建抽象层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46559464/

相关文章:

c# - 如何使用非前缀关键字从列表中进行搜索

c# - 如何将字符串的值转换为类型

c# - 如何在 Entity Framework 6(代码优先)中调用存储过程?

c# - 使用 Entity Framework 的最小存储库实现

c# - 使用 Dapper 的 SQLite。分析列时出错。无法将 System.Int64 类型的对象转换为 System.Double 类型

c# - 在 C# 中将多个文件合并到一个文件中最快的方法是什么?

c# - 无法使用适用于 Windows 7 桌面 (DirectX) 的 Monogame 3.2 播放 SoundEffects

entity-framework - 与 WillCascadeOnDelete 的单向关联

sql-server - 如何让 Dapper 忽略无效数据?

c# - 为什么 Dapper 的 .Execute(...) 返回一个 int?