DDD - 服务专业化

时间:2018-04-18 17:36:20

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

我正在撰写多租户平台即服务解决方案,并尝试采用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); }

也许,第三种选择?

1 个答案:

答案 0 :(得分:0)

首先不要在ClientA服务上使用userRepository将业务与基础架构层分开。

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