【问题标题】:Best way to separate features by user type按用户类型分离功能的最佳方法
【发布时间】:2017-01-26 19:56:26
【问题描述】:

当您必须根据用户类型限制/修改功能时,你们如何设计软件架构?例如,假设我们有 3 种用户类型:

  • 免费
  • 高级版
  • 商务

以及我们正在为图像上传实现 API 的功能。

现在棘手的部分是:

  • 免费用户可以上传 10 张图片。
  • 高级用户可以上传 100 张图片
  • 企业用户可以上传 1000 张图片。

好吧,我知道我可以在处理请求的方法上做一个“if”,但是由于还有许多其他类似的情况(取决于用户类型的功能),我想找出一个更好的更多此问题的可扩展解决方案。

有什么想法吗?

【问题讨论】:

    标签: architecture


    【解决方案1】:

    您可以使用多态性,也就是说,有不同的子类在每种情况下以不同的方式实现相同的方法。

    例如,您可以有一个User 类,具有子类FreeUserPremiumUserBusinessUser,当您调用User.UploadImage 时,每个用户子类型会有不同的限制。

    基类将包含所有其他方法(类似情况)。

    【讨论】:

    • 是的,这行得通。但是我已经有两种不同类型的用户。一个用于管理员,另一个用于用户。此外,我做出了使用贫血域模型的错误决定,因此所有业务逻辑都在服务类上实现。也许如果我只是为每个计划/用户类型创建一个服务并根据其类型将其注入用户,我也许可以满足相同的目的......我唯一害怕的是增加不必要的复杂性。你怎么看?
    • 多态与“基于类型的条件”完全相反:sourcemaking.com/refactoring/…
    • 是的,我知道。而且绝对是要走的路。我将重组我的实体和当前架构。非常感谢!
    • 您还可以有一个PlanPolicyService 服务,可以为每种计划类型配置策略。这些可以与 Map 相关联或使用谓词来避免 if 语句。代码看起来像planPolicyService.canUploadImages(PlanType.Free, imageCount)。这种策略的优点是可以动态设置规则(例如从文件或数据库加载)。
    • @heltonbiker 好吧,困扰我的不是使用对象,而是继承部分。如果唯一真正改变的是管理同一组操作的规则,则不需要专门的用户类型的完全层次结构。最好改用组合,并拥有一个单独的专用PlanPolicyService 允许该或任何其他外部化规则的策略。你可以像user.UploadImage(image, planPolicyService)这样调用聚合。
    猜你喜欢
    • 2014-01-08
    • 2011-02-19
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多