【问题标题】:DDD - service specializationDDD-- 服务专业化
【发布时间】:2018-09-29 01:20:08
【问题描述】:

我正在编写一个多租户平台即服务解决方案,并尝试采用 DDD 方法。我有一些基本的核心功能,这是默认行为,并且其服务暴露给 API(应用程序)层。 到目前为止,一切都很简单,直到我开始编写每个租户的自定义功能(Core 之上的独立项目)。如何扩展基础服务以添加自定义行为?

例如Core服务:

namespace Core.Services
{
    public class UserService
    {
        private readonly IUserRepository userRepository;

        public User Get(Guid id)
        {
            userRepository.GetById(id);
        }

        public void Update(Guid id, UserStatus newUserStatus)
        {
            userRepository.UpdateStatus(Guid id, newUserStatus);
        }
    }
}

现在,我有一个ClientA,比如说,他想根据用户的活动定期重命名用户:

namespace ClientA.Services
{
    public class UserService // : Core.UserService ?
    {
        public void RenameInactiveUsers()
        {
            // something like
            userRepository.UpdateAll(
                condition: (user) => { user.NotActiveRecently() },
                action: (user) => { user.Name = user.Name + " (inactive)" }
            )
        }

        public void BanSuspiciousUsers()
        {
            userRepository.UpdateAll(
                condition: (user) => { user.SomeSuspiciousFlag },
                action: (user) => { user.Status = UserStatus::Banned }
            );
        }

        // etc
    }
}

那么,我如何在扩展基础服务的同时仍然暴露GetUpdate 和其他方法来重用代码?

应该是继承吗?这样,我将不得不使私有存储库、数据和方法在祖先中可访问。此外,据我所知,在 DDD 中不鼓励继承。

或者我应该为每个租户创建新的UserService,它采用Core.UserService 并公开相同的合同,这将导致许多类似的代码

ClientA.UserService.Get(id) { return udnerlyingUserService.Get(id); }?

也许,还有第三种选择?

【问题讨论】:

    标签: c# service repository domain-driven-design paas


    【解决方案1】:

    首先不要在 ClientA 服务上使用 userRepository 将业务与基础设施层分离。

    clientA 中的实现只能是对服务的简单调用:Core.userService,然后在该级别调用存储库。

    【讨论】:

      猜你喜欢
      • 2020-07-18
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 2016-11-15
      • 1970-01-01
      • 2021-07-26
      • 2014-10-08
      相关资源
      最近更新 更多