您应该使用特定于您当前操作的 DTO,然后将数据从 DTO 复制到您要使用的实际对象。
这样做的好处是您可以定义特定于此操作的验证,并且您将没有业务对象的属性。您可以对每个新 DTO 的每个操作使用不同的验证规则,并且仍然使用相同的业务对象。
如果您不想编写从 DTO 映射到业务对象的映射代码,您可以使用 AutoMapper。
示例代码:
public enum ColourType
{
Flat,
Metallic
}
public class Car
{
public void Repaint(int red, int green, int blue, ColourType colourType)
{
// TODO: Add some validation logic and business logic.
}
}
public class RepainInMetallicModel
{
[Required]
[Range(0, 100)]
public int Red { get; set; }
[Required]
[Range(0, 100)]
public int Green { get; set; }
[Required]
[Range(0, 100)]
public int Blue { get; set; }
}
public class RepaintInFlatModel
{
[Required]
[Range(0, 255)]
public int Red { get; set; }
[Required]
[Range(0, 255)]
public int Green { get; set; }
[Required]
[Range(0, 255)]
public int Blue { get; set; }
}
public class CarController
{
public ActionResult RepaintInMetallic(RepainInMetallicModel model)
{
if (ModelState.IsValid)
{
var car = _carsRepository.Find(model.Id);
var.Repaint(model.Red, model.Green, model.Blue, ColourType.Metallic);
_carsRepository.Save(car);
}
return View();
}
public ActionResult RepaintInFlat(RepaintInFlatModel model)
{
if (ModelState.IsValid)
{
var car = _carsRepository.Find(model.Id);
var.Repaint(model.Red, model.Green, model.Blue, ColourType.Flat);
_carsRepository.Save(car);
}
return View();
}
}
以下示例并未演示AutoMapper 的用法,但确实演示了DTO 的用法。