我正在撰写多租户平台即服务解决方案,并尝试采用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
}
}
那么,如何在展示Get
,Update
和其他方法的同时扩展基本服务以重用代码?
它应该是继承吗?这样我将不得不在祖先中访问私有存储库,数据和方法。此外,据我所知,在DDD的劝阻中继承。
或者我应该为每个租户创建新的UserService
,这需要Core.UserService
并公开相同的合同,这将导致许多代码,如
ClientA.UserService.Get(id) { return udnerlyingUserService.Get(id); }
?
也许,第三种选择?
答案 0 :(得分:0)
首先不要在ClientA服务上使用userRepository将业务与基础架构层分开。
clientA中的实现只能是对服务的简单调用:Core.userService,并在该级别调用存储库。