在Ward的文章“The Breeze Server: Have It Your Way”中:
典型的业务应用程序至少有200个域模型 类型。 90%以上的时间我发送的数据的形状 wire与我的商业模式中的实体形状相同 ...
当客户端实体的形状与形状不完全对齐时 在服务器端的业务实体中,我可以为此切换到DTO 特殊情况。
对于我们的应用程序来说,这可以直接敲击头部,但是为DTO切换某些实体的最佳方法是什么?
例如,我们的用户实体包含不应向客户端公开的敏感属性。它还具有从其他系统中提取并返回到客户端的相关数据,理想情况下,这些数据应该是客户端User对象的额外属性。用户似乎是切换到DTO的理想候选者。
如果User是一个孤立的实体,这可能会更容易,但问题是模型中的用户基本上是到处。例如,几乎每个实体都有 CreatedBy 属性。
有没有办法在模型中的任何地方切换用户DTO的用户实体?对于模型中引用用户的所有其他实体,我们仍然需要能够在扩展其用户属性的情况下加载它们,在这些用户属性上查询它们,并通过对这些用户属性的更改来保存它们。
除了构建与实体模型95%相同的大DTO模型之外,我不确定如何做到这一点,并且在它们之间有一些映射代码/框架。但是,正如沃德在this post中所说的那样,“我不喜欢每种类型的DTO;这种过度杀戮会破坏生产力。”
答案 0 :(得分:5)
你的公司很好。像这样的问题正在堆积。我希望尽快提供更好的指导和#34;
在短期内(假设您是.NET开发人员),您可以在DocCode示例中找到一些线索。搜索" ProductDto"。 DocCode没有显示您如何保存对其的更改,因此我必须将其保留到另一个时间。
您的方案实际上可能很容易解决。
DbContext
首先编写商业模式的子类DbContext
。向此子类添加对OnModelCreating
的覆盖,并教会它忽略不应属于模型的User
属性。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().Ignore(u => u.whatever);
...
base.OnModelCreating(modelBuilder);
}
现在,在与客户沟通时,请参考此派生的DbContext
。
请注意,这涉及非常少量的代码并且易于维护。它不会干扰您使用基座DbContext
,该基座保留对User
所有属性的完全访问权限。
关注James Newton King's guidance。如果您不想使用IContractResolver
属性修饰/污染User
类,请特别注意[JsonIgnore]
。 James是JSON.NET的作者。