c# - 为什么要抽象一个 ORM?

标签 c# orm repository abstraction

我经常看到使用存储库模式来抽象 ORM 的代码。为什么这样做? ORM 不是已经是一个抽象并且本身充当存储库吗?

有很大区别吗

public class EmployeeRepo 
{
    GetById(int id) { //Access ORM here };
}

消费数据:

public class MyController{
    private EmployeeRepo = _Repo = new EmployeeRepo();

    public ActionResult ShowEmployee(int id)
    {
        var emp = _Repo.GetById(id);
        //Versus
        var emp = ORM.Where(e => e.Id == id);

        return View(emp);
    }
}

我为什么要重新创建 ORM 已经给我的东西?

最佳答案

我知道这是一个老问题,但这个主题很有趣。

我同意直接使用 ORM 更容易,在简单项目中这可能是正确的做法。

但是,如果您正在开发长期存在的复杂系统,那么在您的业务逻辑中直接依赖 ORM 意味着您在数千个地方都依赖于该 ORM。由于该 ORM 中的破坏性更改或仅仅因为您决定以其他方式做某事,这将不可避免地在将来产生问题。

因此,抽象 ORM 与其说是关于轻松切换 ORM 的能力,不如说是关于将您的项目与外部依赖项解耦(由于流行的 ORM 的复杂性和持续开发,破坏性更改的可能性足够高)。此外,拥有这样一个解耦架构,作为奖励,您的项目将获得良好的可测试性。

如果您不想自己进行抽象,周围有一些项目(例如 Antler)可以帮助您。当然,这意味着您将依次依赖于这些框架,但此类框架负责处理不同的 ORM(并破坏该 ORM 中的更改),为您提供实际上永远不会更改的抽象和统一语法。

关于c# - 为什么要抽象一个 ORM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17028474/

相关文章:

java - Hibernate - native SQL 参数的奇怪顺序

c# - asp.net C# 中的 SQL IN 运算符

c# - 音频源播放2分钟后执行一些操作

python - SQLAlchemy 按分钟分组

repository - 如何将 ormlite 注入(inject)或连接到 ServiceStack 存储库?

git 检查工作副本存储库是否存在并验证它

mercurial - 如何在 Mercurial 中按存储库设置不同的用户名?

c# - Shell 脚本与高级解释语言(C#/Java/等)的性能比较

c# - RAII 是如何在 Java/Scala 等具有垃圾回收功能的语言中替换/实现的?

java - hibernate 异常 _$$_javassist_0 无法转换为 javassist.util.proxy.Proxy