在域驱动设计文献中,经常说域服务应该是无状态的。
我相信这是因为服务调用应该代表单个工作单元。不应该有多个服务方法会使用的任何服务状态。
我在我的服务架构中打破了这条规则,以便我可以构造函数注入服务中所需的所有相关存储库。例子:
public class UserService : IUserService
{
public IUnitOfWork UnitOfWork { get; set; }
public IUserRepository UserRepository { get; set; }
public ICustomerRepository CustomerRepository { get; set; }
public UserService(IUnitOfWork unitOfWork, IUserRepository userRepository, ICustomerRepository customerRepository)
{
UnitOfWork = unitOfWork;
UserRepository = userRepository;
CustomerRepository = customerRepository;
}
public User RegisterNewUser(...)
{
// Perform relevant domain logic
}
// ...
}
为了让我在 上使用构造函数注入UserService
,我需要有状态(属性),以便服务方法可以访问相关的存储库等。
尽管我希望将各个服务方法设计为独立的工作单元,但我不一定能阻止这种情况的发生。
我如何构建域服务以使其无状态? 这甚至有必要吗?
编辑:
领域驱动设计中的Eric Evans :解决软件核心的复杂性:
当域中的重要过程或转换不是实体或值对象的自然责任时,将操作添加到模型中作为声明为服务的独立接口。根据模型的语言定义接口,并确保操作名称是 UBIQUITOUS LANGUAGE 的一部分。使 SERVICE 无状态。
Vaughn Vernon还在他的《实现领域驱动设计》一书中推荐了无状态服务。