【发布时间】: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
}
}
那么,我如何在扩展基础服务的同时仍然暴露Get、Update 和其他方法来重用代码?
应该是继承吗?这样,我将不得不使私有存储库、数据和方法在祖先中可访问。此外,据我所知,在 DDD 中不鼓励继承。
或者我应该为每个租户创建新的UserService,它采用Core.UserService 并公开相同的合同,这将导致许多类似的代码
ClientA.UserService.Get(id) { return udnerlyingUserService.Get(id); }?
也许,还有第三种选择?
【问题讨论】:
标签: c# service repository domain-driven-design paas