Breeze.js混合DTO和实体

时间:2014-03-28 10:49:03

标签: entity-framework breeze dto

在Ward的文章“The Breeze Server: Have It Your Way”中:

  

典型的业务应用程序至少有200个域模型   类型。 90%以上的时间我发送的数据的形状   wire与我的商业模式中的实体形状相同   ...
  当客户端实体的形状与形状不完全对齐时   在服务器端的业务实体中,我可以为此切换到DTO   特殊情况。

对于我们的应用程序来说,这可以直接敲击头部,但是为DTO切换某些实体的最佳方法是什么?

例如,我们的用户实体包含不应向客户端公开的敏感属性。它还具有从其他系统中提取并返回到客户端的相关数据,理想情况下,这些数据应该是客户端User对象的额外属性。用户似乎是切换到DTO的理想候选者。

如果User是一个孤立的实体,这可能会更容易,但问题是模型中的用户基本上是到处。例如,几乎每个实体都有 CreatedBy 属性。

有没有办法在模型中的任何地方切换用户DTO的用户实体?对于模型中引用用户的所有其他实体,我们仍然需要能够在扩展其用户属性的情况下加载它们,在这些用户属性上查询它们,并通过对这些用户属性的更改来保存它们。

除了构建与实体模型95%相同的大DTO模型之外,我不确定如何做到这一点,并且在它们之间有一些映射代码/框架。但是,正如沃德在this post中所说的那样,“我不喜欢每种类型的DTO;这种过度杀戮会破坏生产力。”

1 个答案:

答案 0 :(得分:5)

你的公司很好。像这样的问题正在堆积。我希望尽快提供更好的指导和#34;

在短期内(假设您是.NET开发人员),您可以在DocCode示例中找到一些线索。搜索" ProductDto"。 DocCode没有显示您如何保存对其的更改,因此我必须将其保留到另一个时间。

您的方案实际上可能很容易解决。

第1步:使用自定义DbContext

首先编写商业模式的子类DbContext。向此子类添加对OnModelCreating的覆盖,并教会它忽略不应属于模型的User属性。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<User>().Ignore(u => u.whatever);
   ...
   base.OnModelCreating(modelBuilder);
}

现在,在与客户沟通时,请参考此派生的DbContext

请注意,这涉及非常少量的代码并且易于维护。它不会干扰您使用基座DbContext,该基座保留对User所有属性的完全访问权限。

步骤2:配置JSON.NET以从序列化中排除这些属性

关注James Newton King's guidance。如果您不想使用IContractResolver属性修饰/污染User类,请特别注意[JsonIgnore]。 James是JSON.NET的作者。