【发布时间】:2023-03-20 14:15:02
【问题描述】:
我们通过在实体和值对象类中结合数据和行为,在模型中遵循领域驱动设计原则。我们经常需要为我们的客户定制行为。下面是一个客户想要更改 FullName 格式的简单示例:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
// Standard format is Last, First
public virtual string FullName => $"{LastName}, {FirstName}";
}
public class PersonCustom : Person
{
// Customer wants to see First Last instead
public override string FullName => $"{FirstName} {LastName}";
}
如您所料,在 DbContext 上配置了 DbSet:
public virtual DbSet<Person> People { get; set; }
在运行时,需要实例化 PersonCustom 类来代替 Person 类。当我们的代码负责实例化实体时,这不是问题,例如添加新人时。 IoC Container/Factory 可以配置为用 PersonCustom 类代替 Person 类。但是,在查询数据时,EF 负责实例化实体。在查询 context.People 时,是否有某种方法可以配置或拦截实体创建以在运行时用 PersonCustom 代替 Person 类?
我在上面使用了继承,但如果它有所作为,我可以实现一个 IPerson 接口。无论哪种方式,您都可以假设两个类中的接口相同。
编辑:更多关于如何部署的信息...... Person 类将成为适用于所有客户的标准构建的一部分。 PersonCustom 将进入一个单独的自定义程序集,该程序集只发送给想要更改的客户,因此他们将获得标准构建和自定义程序集。我们不会创建整个项目的单独构建来适应定制。
【问题讨论】:
-
为什么不改用
DbSet<PersonCustom> People? -
@PaoloGo 我在帖子中添加了一些部署信息。请注意,PersonCustom 类仅对需要定制的一位客户可用。您是否建议我们为该客户创建一个单独的 DbContext 以指定
DbSet<PersonCustom> People? -
继承不是正确的模式。继承是关于“事物”的分层类别,定义事物是。仅仅拥有另一个名称格式偏好并不会从本质上重新定义 Person 是什么。 IMO 策略是正确的模式。
标签: c# entity-framework-core domain-driven-design