我目前正在内部使用ASP.NET Core应用程序。该应用程序应列出日期,并根据日期允许某些操作,而不允许其他操作。我可以完美地使用支架视图,并且它们可以精确显示我想要的东西,但有一个例外: 如果不允许进行操作,我希望将其显示为灰色。
我的想法是向DateTime添加一个名为IsSpecialOperationPermitted的扩展方法,以便我可以轻松地使用dateTimeInstance.IsSpecialOperationPermitted。
“ IsSpecialOperationPermitted”方法取决于某些计算以及数据库中的另一个表。现在,要使用扩展方法,我想访问该表。通常,我会创建一个ApplicationDbContext实例并查询该表。
对于ASP.NET Core,我觉得这不是正确的方法,但是我应该请求一个已经存在的ApplicationDbContext。通常,此ApplicationDbContext或多或少会自动注入,但是我的扩展方法中没有ApplicationDbContext。
在我的扩展方法中请求ApplicationDbContext的“正确”方法是什么?
答案 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
属性,否则您的方法将看不到它们。