地址 https://aspnetboilerplate.com/Pages/Documents/Domain-Services#introduction
1.介绍:
领域服务(只是DDD领域中的服务)通常用来执行领域操作或业务规则。
- The operation relates to a domain concept that is not a natural part of an Entity or Value Object.
- The interface is defined in terms of other elements of the domain model.
- The operation is stateless.
应用服务用来传输对象,领域服务获取 或者 返回 “实体或值类型”。
域服务可由应用服务和其他域服务使用,但不能直接由表示层(UI层、webapi接口层)使用(应用程序服务用于该服务)。
2.如何创建领域服务
一般情况下:
Creating an Interface
First, we define an interface for the service (not required, but good practice):
public interface ITaskManager : IDomainService
{
void AssignTaskToPerson(Task task, Person person);
}
Service Implementation
public class TaskManager : DomainService, ITaskManager
{
public const int MaxActiveTaskCountForAPerson = 3;
private readonly ITaskRepository _taskRepository;
public TaskManager(ITaskRepository taskRepository)
{
_taskRepository = taskRepository;
}
public void AssignTaskToPerson(Task task, Person person)
{
if (task.AssignedPersonId == person.Id)
{
return;
}
if (task.State != TaskState.Active)
{
throw new ApplicationException("Can not assign a task to a person when task is not active!");
}
if (HasPersonMaximumAssignedTask(person))
{
throw new UserFriendlyException(L("MaxPersonTaskLimitMessage", person.Name));
}
task.AssignedPersonId = person.Id;
}
private bool HasPersonMaximumAssignedTask(Person person)
{
var assignedTaskCount = _taskRepository.Count(t => t.State == TaskState.Active && t.AssignedPersonId == person.Id);
return assignedTaskCount >= MaxActiveTaskCountForAPerson;
}
}
3. 应用层调用领域服务
一般情况:
创建应用层服务接口
实现应用层服务接口
实现例子:
“ApplicationService, ITaskAppService”
public class TaskAppService : ApplicationService, ITaskAppService
{
private readonly IRepository<Task, long> _taskRepository;
private readonly IRepository<Person> _personRepository;
private readonly ITaskManager _taskManager;
public TaskAppService(IRepository<Task, long> taskRepository, IRepository<Person> personRepository, ITaskManager taskManager)
{
_taskRepository = taskRepository;
_personRepository = personRepository;
_taskManager = taskManager;
}
public void AssignTaskToPerson(AssignTaskToPersonInput input)
{
var task = _taskRepository.Get(input.TaskId);
var person = _personRepository.Get(input.PersonId);
_taskManager.AssignTaskToPerson(task, person);
}
}
4.官网上的一些说明
Why not use only the Application Services?
为什么不直接使用应用服务?
参考官网说明 https://aspnetboilerplate.com/Pages/Documents/Domain-Services#some-discussions
理解领域驱动不是一天两天就能理解的,慢慢跟着学习吧。
5. 我们如何强制使用域服务
这个做法666666