【发布时间】:2018-09-24 12:54:39
【问题描述】:
我正在努力将我的一个系统更新为更面向 DDD 的方法,并着眼于从我的程序中消除贫血的域模型。
我正在尝试了解从孩子更新基类的最佳实践。
我有两节课。 (以下简化)
public class WorkItem
{
public int Y {get; private set;}
public int X {get; private set;}
public void Update(int x, int y)
{
Validate(x);
Validate(y);
X = x;
Y = y;
}
public void Validate(int x)
{
///Validation rules here
}
}
public class Ticket:WorkItem
{
public int Id {get; set;}
public int Z {get; set;}
}
这是一个 Web 应用程序,因此我可以更新票证。所以让我们假设我现在有一个看起来像这样的服务
public void UpdateTicket(int Id)
{
var ticket = _context.Tickets.Where(c=>c.Id == Id).SingleOrDefault();
//Update Tickets
_context.SaveChanges();
}
我希望能够在运行 Validate 方法的同时同时更新 Workitem 类和工单类中的字段。
这是我想出的选项:
选项 A
public class Ticket:WorkItem
{
public int Id {get; set;}
public int Z {get; set;}
public void Update(int x, int y, int z)
{
base.Validate(z);
base.Update(x, y);
Z=z;
}
}
在子级中添加一个更新方法,该方法调用父级中的更新方法。如果我添加另一个级别的继承,这开始感觉很混乱,因为我必须将父成员从底部传递到顶部。
选项 B:
public class Ticket:WorkItem
{
public int Id {get; set;}
public int Z {get; set;}
public void Update(int x, int y, int z)
{
base.Validate(z)
base.Validate(x)
base.Validate(y)
X = x;
Y = y;
Z = z;
}
}
在不调用父级中的 Update 方法的情况下显式更新子级 update 方法中的属性。这种方法感觉更好,但由于某种原因仍然感觉不对
我不完全确定这两种方法是否正确,请您推荐解决此类问题的最佳方法。
【问题讨论】:
-
要考虑的一个选项 - 在基类 (
WorkItem) 中创建一个ValidateThenUpdate方法。在基类中添加一个虚拟的Validate方法(没有参数,它验证该级别的类的所有属性)。在基类中添加一个虚拟的Update方法。ValidateThenUpdate调用Validate然后Update。您的Ticket类将继承基类并覆盖Validate和Update(包括对base.Validate等的调用)。 -
也许你应该考虑组合而不是继承?工单应该有一个工作项作为成员。每个对象都应该有自己的方法并实现自己的接口。看起来您也在幕后使用数据库,因此使用两个不同的表和连接它们的外键会更容易。另外,我相信有些工单没有与之关联的工作项..
-
@mjwills 如果方法是无参数的,那么类如何知道哪些字段需要更新和验证?
-
为什么需要将 x、y 和 z 传递给
Update?为什么不让设置器在 X 和 Y 上公开,并在更新中验证属性?这样您就可以使其成为虚拟并覆盖(或者,只需在设置器本身中调用 validate,如果这对您的使用更有意义) -
我会设想一个模型,其中属性是读写的(而不是您当前的只读)。调用者设置属性,然后调用
ValidateThenUpdate。 基本上是@KMoussa 所说的。
标签: c# .net inheritance