【发布时间】:2013-08-21 17:56:06
【问题描述】:
这在Project Silk中专门用于参考DDD。
项目使用DDD,实现了Handlers和Services的概念。 这两种类型究竟有什么区别和用例?
例如,有一个服务UserServices 用于创建用户。
但是 Vehicle 的创建是在 Handler 中完成的。
想知道这个决定背后的原因。
域\用户服务
public class UserServices : IUserServices
{
private readonly IUserRepository userRepository;
public UserServices(IUserRepository userRepository)
{
if (userRepository == null)
throw new ArgumentNullException("userRepository");
this.userRepository = userRepository;
}
public User CreateUser(User newUser)
{
if (newUser == null) throw new ArgumentNullException("newUser");
try
{
Model.User userToAdd = ToDataModelUser(newUser);
this.userRepository.Create(userToAdd);
return ToServiceUser(userToAdd);
}
catch (InvalidOperationException ex)
{
throw new BusinessServicesException
(Resources.UnableToCreateUserExceptionMessage, ex);
}
}
}
域\处理程序\CreateVehicle.cs
public class CreateVehicle
{
private readonly IVehicleRepository _vehicleRepository;
private readonly IVehiclePhotoRepository _photoRepository;
public CreateVehicle(IVehicleRepository vehicleRepository,
IVehiclePhotoRepository photoRepository)
{
_vehicleRepository = vehicleRepository;
_photoRepository = photoRepository;
}
public virtual void Execute(int userId,
ICreateVehicleCommand vehicleForm,
HttpPostedFileBase photoFile)
{
if (vehicleForm == null) throw
new ArgumentNullException("vehicleForm");
try
{
var vehicle = vehicleForm.ConvertToEntity(userId);
_vehicleRepository.Create(userId, vehicle);
if (photoFile == null) return;
// the double reference between vehicle and photo
//is a potential source of pain
var photo = photoFile.ConvertToEntity();
_photoRepository.Create(vehicle.VehicleId, photo);
vehicle.PhotoId = photo.VehiclePhotoId;
_vehicleRepository.Update(vehicle);
}
catch (InvalidOperationException ex)
{
throw new BusinessServicesException
(Resources.UnableToCreateVehicleExceptionMessage, ex);
}
}
}
【问题讨论】:
-
我想这在很大程度上是因为用户管理被认为是一个基础广泛的系统活动(无论您的问题领域如何,您都将需要它),而车辆实际上是您的定义的问题域。请注意,UserServices 派生自 IUserServices。
-
@RobertHarvey 我注意到 UserServices 仅包含使用 IUserRepository 但处理程序有多个存储库在使用。这是否要求服务应仅由其自己的存储库组成?
-
不一定,但我无法想象为什么您需要多个 UserServices。
-
@RobertHarvey 所以用户没有在处理程序中处理的唯一原因是因为它们可以作为应用程序服务公开给多个不同的外部调用?虽然问题域特定处理程序仅由其特定控制器调用?这是一个公平的结论吗?
-
我必须更仔细地查看源代码才能了解那里发生了什么,但这与 Silk 本身并没有太大关系。 Silk 是一种客户端架构;您在这里谈论的内容都在模型中。可能与 DDD 的关系比其他任何事情都多。
标签: .net asp.net-mvc c#-4.0 architecture domain-driven-design