为 DbSet<T> 创建扩展方法是一种不好的做法吗?

问题描述

我对 EF Core 有点陌生,想知道为 DbSet 创建扩展方法是否是对它的误用。

我的代码库中有很多长查询,我认为这些查询会从扩展方法中受益(从可维护性角度来说)。

对我来说,这个

 var appUseRSSegments = dbContext.ApplicationUseRSSegments
    .Where(a => a.App.AppId == selectedApp.AppId)
    .OrderBy(a => a.CreatedDate)
    .ToList();

很容易

 var appId = 232;
 var appUseRSSegments = dbContext.ApplicationUseRSSegments.FindRecent(appId);

因为这样可以防止我的代码因到处都是相同的长查询而变得臃肿。

有什么我不知道的关于 DbSet 或 EF Core 的东西比创建扩展方法更好吗?

解决方法

您可能不应该这样做,因为从长远来看会更难维护。

它还使开发人员能够编写糟糕的代码。

比如,直接从任何地方调用 DbContext 使用扩展方法,同时说它是没有任何抽象的代码重用。

最佳实践是实现一个服务,无论是使用 repository pattern 还是 CQRS pattern,它都抽象了 DbContext 的用法,并在其中包含这段代码而不是扩展。

然后为了可重用性,您可以调用服务来执行您的代码而不是扩展。

这将使您能够控制这些片段中的依赖项,并且您将能够以更简单的方式使用依赖项注入来切换实现。