【发布时间】:2020-08-12 17:20:36
【问题描述】:
我正在为我的 .NET Core 应用程序实现安全功能,我发现自己一遍又一遍地重复相同的条件逻辑。 有没有一种方法可以将其概括在一个地方并将其应用于我想要的细分市场? 我记得在这类事情上使用了代表或 Func,但我不太确定......有什么想法吗?
以下是我尝试编写一次并在多个地方应用的代码。
var currentUser = _httpContext.HttpContext.Session.GetCurrentUser<SessionContext>();
if(currentUser.Roles.Any())
{
// ex query here. This could be any piece of code
var q = from u in _dbContext.Users
join d in _dbContext.Users on u.DoctorId equals d.Id into ud
from docU in ud.DefaultIfEmpty()
select new
{
User = u,
Doctor = docU
};
if(!currentUser.Roles.Contains("Administrator"))
{
if(currentUser.Roles.Contains("Doctor"))
{
//do something here
//ex.
q = q.Where(x => (x.Doctor != null ? x.Doctor.Id == currentUserId : false));
}
else if (currentUser.Roles.Contains("Patient"))
{
//do something else here
//ex.
q = q.Where(x => x.User.Id == currentUserId);
}
}
}
else
throw new Exception("No roles applied to logged in user");
【问题讨论】:
-
你是说你在多个地方都有这个特定的代码块,还是你在为这个单一代码块中的多个 if 语句而烦恼?
-
我在多个地方都有这段代码。我不太担心多个 if 语句。
-
如果不知道您在 If 语句中所做的事情,很难知道会发生什么变化。如果这是针对控制器方法上的 API,您可以添加 Authorize 属性,例如
[Authorize(Roles = "Doctor", "Patient")] -
我正在我的 if 语句中编写 linq 查询。但我想我的目标是在这些 if 语句中写任何东西,但保持外部逻辑。我已经更新了我的示例。干杯!
-
我认为你应该看看 C# 中的规范模式
标签: c# .net-core delegates func code-reuse