gpt4 book ai didi

c# - 一个很好的设计模式,用于在一个主题上实现不同的行为

转载 作者:太空狗 更新时间:2023-10-29 17:56:37 25 4
gpt4 key购买 nike

这个场景的最佳设计是什么?
我有不同的对象类型:UserChannelMessageBoxUserGroup
UserChannel 可以拥有其他对象的权限。例如 User 将以下枚举定义为其对 MessageBox 的权限:

CanRead,
CanWrite,
CanDelete,
...

其他枚举是为 User 定义的,作为其他对象类型的所有者。

此外,Channel 在这些对象上具有不同的枚举值。例如,将 Channel 视为所有者,将 MessageBox 视为对象:

CanDispath
CanRetrieve
...

使用按位比较从数据库中的特定表保存和检索所有权限:

OwnerID........OwnerType........ObjectID........ObjectType........AccessLevel  
1 User 10 MessageBox 38
5 Channel 12 MessageBox 18

现在在代码隐藏中,实现权限类的最佳方法是什么?

1- 分别定义 PermissionManagerUserPermissionManagerChannelPermissionManager 类。其他类只是像这样调用 PermissionManager:

if (new PermissionManager.HasAccess(CurrentUser,  
CurrentMessageBox,
UserPermissions.CanReadMessages))

然后 PermissionManager 根据 OwnerType(UserPermissionManagerChannelPermissionManager)决定这与哪个类相关调用其 HasAccess 方法。这样,PermissionManager.HasAccess 总是被调用,我认为它可以使代码更易于维护和扩展。这是我的首选解决方案,但由于 PermissionManagerUserPermissionManagerChannelPermissionManager 引用相同的上下文,我认为应该有一个层次结构或者可能是一个接口(interface)所以这三个类变得更加整合。但我不知道如何将它们联系在一起。

2- 定义IPermissionManager 接口(interface)并从中实现UserPermissionManagerChannelPermissionManager。添加 PermissionManagerTypes 枚举。创建一个工厂类并像这样调用管理器:

IPermissionManager UserManager =   
PermissionFactory.Create(PermissionsManagerTypes.User);
if (UserManager.HasAccess(CurrentUser,
CurrentMessageBox,
UserPermissions.CanReadMessages))

这是一种将类关联在一起的失败尝试。但我认为最好在这里提及它,让您知道我正在努力实现的目标。

附言我不能将类定义为静态的,因为它们需要有一个 ObjectContext 类型的私有(private)变量( Entity Framework )。

是否有更好的解决方案来实现这一目标?
谢谢你,很抱歉提出这么长的问题。

最佳答案

好吧,这很难回答。您可以尝试创建一个基础接口(interface) IPermission;

interface IPermission<TOwner>
{
}

然后为您希望能够拥有权限的类型实现此接口(interface)。

class UserPermission : IPermission<User>
{
public UserPermission(CustomerPermissionType type)
{
// Store the type
}
}

class ChannelPermission : IPermission<Channel>
{
public ChannelPermission (ChannelPermissionType type)
{
// Store the type
}
}

现在您需要一个为特定对象提供权限的接口(interface)。

interface IPermissionProvider
{
bool HasPermission<TOwner>(IPermission<TOwner> permission, TOwner owner, object target);
}

此时您已具备查询权限的基本功能。问题是如何管理对用户和 channel 权限的不同处理。你可以实现这样的东西:

class PermissionDispatcher : IPermissionProvider
{
public void RegisterPermissionProvider<TOwner>(IPermissionProvider permissionProvider)
{
// Store it somewhere
}

public IPermissionProvider GetPermissionProvider<TOwner>()
{
// Look up a permission provider that is registered for the specified type TOwner and return it.
}

bool IPermissionProvider.HasPermission<TOwner>(IPermission<TOwner> permission, TOwner owner, object target)
{
IPermissionProvider permissionProvider = GetPermissionProvider<TOwner>();
return permissionProvider .HasPermission<TOwner>(permission, owner, target);
}
}

最后一步是为 User 和 Channel 创建 IPermissionProvider 的特定实现,并在您的应用程序/服务启动时将它们注册到 PermissionDispatcher。

用法就这么简单:

void foo()
{
IPermissionProvider permissionProvider = ... the dispatcher, could be a singleton ...;
User user = ...;
MessageBox messageBox = ...;
UserPermission userCanReadPermission = new UserPermission(UserPermissionType.CanRead);
bool hasUserCanReadPermission = permissionProvider.HasPermission(userCanReadPermission, user, messageBox);

像这样的事情将是解决这个问题而不依赖于域类型中的权限处理的唯一方法。尽管如此,我绝对确定这不是完美的解决方案。

关于c# - 一个很好的设计模式,用于在一个主题上实现不同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6249729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com