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

本文关键字:实现 一个 很好 设计模式 用于 | 更新日期: 2023-09-27 17:58:24

这个场景的最佳设计是什么
我有不同的对象类型:UserChannelMessageBoxUserGroup等。
CCD_ 5和CCD_。例如,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基于OwnerTypeUserPermissionManagerChannelPermissionManager)来决定这与什么类相关,并调用其HasAccess方法。通过这种方式,PermissionManager.HasAccess总是被调用,我认为它可以使代码更易于维护和扩展。这是我的首选解决方案,但由于PermissionManagerUserPermissionManagerChannelPermissionManager引用相同的上下文,我认为应该有一个层次结构,或者可能有一个接口,这样这三个类就可以更加集成。但我不知道如何将它们联系在一起。

2-定义IPermissionManager接口,并从中实现UserPermissionManagerChannelPermissionManager。添加PermissionManagerTypes枚举。创建一个工厂类并调用经理,如:

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

这是一种将类关联在一起的失败尝试。但我想最好在这里提到它,让你知道我正在努力实现什么。

附言:我不能将类定义为静态的,因为它们需要有一个ObjectContext(实体框架)类型的私有变量。

有更好的解决方案来实现这一点吗
谢谢你,并为这个冗长的问题道歉。

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

这很难回答。您可以尝试创建一个基本接口IPermission;

interface IPermission<TOwner>
{
}

然后为您希望拥有权限的类型实现此接口。

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

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

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

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

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);
    }
}

最后一步是为用户和通道创建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);

}

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

我根本没有考虑这个问题,但:

interface HasPermissions {
   getPermissionsFor(object)
}
User implements HasPermissions
Channel implements HasPermissions
etc..

User user = new User();
if user.getPermissionsFor(object).contains(canRead)