在扩展方法中使用ApplicationDbContext

时间:2019-01-23 06:58:51

标签: asp.net-core-mvc asp.net-core-2.1

我目前正在内部使用ASP.NET Core应用程序。该应用程序应列出日期,并根据日期允许某些操作,而不允许其他操作。我可以完美地使用支架视图,并且它们可以精确显示我想要的东西,但有一个例外: 如果不允许进行操作,我希望将其显示为灰色。

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

“ IsSpecialOperationPermitted”方法取决于某些计算以及数据库中的另一个表。现在,要使用扩展方法,我想访问该表。通常,我会创建一个ApplicationDbContext实例并查询该表。

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

在我的扩展方法中请求ApplicationDbContext的“正确”方法是什么?

1 个答案:

答案 0 :(得分:1)

您正在尝试在DateTime类型之上构建抽象,这非常好。但是,如果需要db上下文来执行操作,则应显式接受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
    }
}

我认为后者更为清晰。

请记住,扩展方法旨在与已记录的副作用一起使用,从长远来看,某些理论上可能“很容易”作为扩展方法的操作可能会导致过于神秘。

此外,您还应该注意,如果调用方对上下文有待处理的更改,则除非您检查Local属性,否则您的方法将看不到它们。