在扩展方法中使用 ApplicationDbContext

Using ApplicationDbContext in an extension method

我目前正在开发一个供内部使用的 ASP.NET 核心应用程序。此应用程序应列出日期,并根据日期允许某些操作,而另一些则不允许。我可以完美地使用脚手架视图,它们完全显示了我想要的内容,但有一个例外: 如果不允许操作,我想将它们显示为灰色。

我的想法是向 DateTime 添加一个名为 IsSpecialOperationPermitted 的扩展方法,这样我就可以轻松地使用 dateTimeInstance.IsSpecialOperationPermitted。

方法"IsSpecialOperationPermitted"依赖于数据库中的一些计算和另一个table。现在,要使用我的扩展方法,我想访问那个 table。通常我会创建一个 ApplicationDbContext 实例并查询 table.

对于 ASP.NET 核心,我感觉这不是正确的方法,但我应该请求一个已经存在的 ApplicationDbContext。通常此 ApplicationDbContext 或多或少会自动注入,但我的扩展方法中没有 ApplicationDbContext。

在我的扩展方法中请求 ApplicationDbContext 的 "correct" 方法是什么?

您正在尝试在 DateTime 类型之上构建抽象,这完全没问题。但是,如果您需要数据库上下文来执行您的操作,您应该显式地将 DbContext 作为参数来表明您的方法至少需要从中读取。

你可以这样写

public static class DateTimeExtensions
{
    public static bool IsSpecialOperationPermitted(this DateTime value, ApplicationDbContext context)
    {
        // do here your computation
    }
}

另一方面,您可以反转它,并扩展 DbContext:

public static class DbContentExtensions
{
    public static bool IsSpecialOperationPermitted(this ApplicationDbContext context, DateTime value)
    {
        // do here your computation
    }
}

后者在我看来更清晰

请记住,扩展方法旨在处理记录在案的副作用和某些理论上可以 "nice to have" 作为扩展方法的操作,在长 运行 中可能会导致过于神秘。

此外,您应该知道,如果调用者对上下文进行了未决更改,除非您检查 Local 属性.

,否则您的方法将看不到它们