我需要一些关于以下场景定义数据合同的最佳方法的指导:1.我有2种网络方法,一种可以上传原始数据2.此数据在服务器上用于某些计算。即一个项目有一组计算,3.所以我的实体设计是这样的,项目实体具有计算实体的集合。集合未标记为数据成员。4. 方法返回每个项目及其计算集合。5. 我最终为上传和 GetItemDetails 操作定义了 2 个不同的数据合约,因为 Item 是我的主要实体,用于我的所有业务逻辑操作,但它的计算集合是在服务器端生成的数据,必须按需返回 (GetItemDetails)。由于它正在处理数据,因此在上传时公开它似乎不合适,因为计算集合中不需要输入。6. 在我的 GetItemDetails 方法中,我使用"Item"实体并使用计算集合加载项目集合,然后将其转换为我的输出数据合约,其中项目和集合都公开了。
此方法的缺点是必须为同一实体表示形式维护 2 个数据协定。我试图在 GetItemDetails 方法的计算集合上搜索动态添加 DataMember 属性的选项,但没有成功。我希望情况是清楚的。我的问题是在这种情况下定义数据协定的最佳方法是什么,以便客户端不必处理 2 个不同的代理类来表示 Upload 和 Get 的相同 entiy。如果对两者使用相同的实体,以便我的上传合约公开(然后忽略任何输入)计算集合,即使用户不应将其提供给我的上传操作,这将是一个正确的解决方案吗?
我将不胜感激对此的任何帮助。
您应该查看 KnownType WCF 属性。这将允许您指定可以接受的其他对象。
MSDN 上的已知类型属性
另一种选择是使用继承,并具有具有最小属性的基类和从基类继承的更可靠的类。 虽然这不会绕过重复的实体对象,但至少向上转换/向下转换可以工作。
另一种选择是具有单独的对象。 客户端将具体知道需要设置什么。 没有猜测工作。 只公开你需要的东西。 我最倾向于此选项或继承选项。