c# - 如何避免重复条件逻辑?
问题描述
我正在为我的 .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");
解决方案
这是一些用 Swift 编写的代码。我正在使用面向函数的编程和字典
struct User {
var Roles: Set<String> = ["Doctor"]
}
func channel(user: User, _ roles: [String:() -> ()]) {
for i in roles {
if user.Roles.contains(i.key) { i.value() }
}
}
let currentUser = User()
channel(user: currentUser,
[
"Doctor": {
// Code for doctor
},
"Admin": {
// Code for admin
},
"Blah": {
// Code for blah
},
// You can even add more
]
)
你可以枚举 创建一个枚举
为什么是一个枚举?
您可以使用 Enum 的常规字符串轻松
打错字,如果打错字,Swift 会给您一个错误。超级有帮助!
enum UserRolls { case doctor, admin, patient, other(String) }
extension UserRolls: Hashable {}
struct User {
var Roles: Set<UserRolls> = [.doctor]
}
func channel(user: User, _ roles: [UserRolls:() -> ()]) {
for i in roles {
if user.Roles.contains(i.key) { i.value() }
}
}
let currentUser = User()
channel(user: currentUser,
[
.doctor: {
// Code for doctor
},
.admin: {
// Code for admin
},
.other("Blah"): {
// Code for blah
},
// You can even add more
]
)
推荐阅读
- python - 移动椭圆移动 QGraphicsScene 中的其他元素
- java - 读取外部应用程序属性中的 POM 值
- python - 有没有办法将 tkinter 输入框植入我的海龟屏幕(创建绘画)
- mongodb - 我正在尝试为 Rest API 自定义错误格式结构
- apache-zookeeper - 在 Zookeeper 中使用 reconfig 命令删除服务器时导致 MarshallingError 的原因
- c# - C#从特定字符串中查找数值
- node.js - Mongodb 无法从 $addToSet 运算符添加所有元素,省略了一些元素
- rust - 如何使用常量泛型创建固定大小的字符串数组?
- javascript - 我可以使用 laravel 将回历日期添加到完整日历吗
- c# - 我怎样才能避免这种设计的神级反模式