4

我有一个类(人),它是我的 MVVM 应用程序中的模型。我想将此类保存到 Azure 表存储。若要保存到 Azure 表存储,您需要从名为 TableServiceEntity 的类派生。我宁愿不要用用于存储的属性来混淆我的好类(考虑分离关注点似乎是个好主意)。

我可以以某种方式让我的类在运行时从 TableServiceEntity 派生,在接收对象作为参数并将其保存到存储的方法中吗?这将使我的班级保持清洁存储属性,但仍然让我将其保存到表存储。

谢谢!安迪

4

6 回答 6

2

您不能在运行时更改继承。

您可以做的是使用诸如AutoMapper之类的工具从您的域对象映射到从 TableServiceEntity 派生的数据存储对象。

Entity Framework Code First 或 NHibernate 等 O/R 映射器的好处之一是它们不会强迫您从特殊的基类派生。

于 2012-07-20T03:44:05.740 回答
1

不幸的是,不:C# 中的继承是一个编译时概念,因此您的对象必须在编译时从其基类继承。

至于“使用存储属性使代码混乱”,部分类可以提供很大帮助:将与存储相关的属性放在单独的文件中,您的代码将再次看起来很干净。

于 2012-07-20T03:43:13.400 回答
1

听起来只创建一个PersonTableServiceEntity类和一个静态方法来在您的Person实体和实体之间进行转换会更简单PersonTableServiceEntity

于 2012-07-20T03:43:50.530 回答
1

简短的回答——不。这一切都是在 C# 的编译时完成的。对不起

于 2012-07-20T03:44:45.990 回答
1

完全不知道这是否可能,但我觉得这不太可能。只需创建一个 PersonStorage 类以使用单个 Person 实例继承 TableServiceEntity 吗?

于 2012-07-20T03:50:33.507 回答
1

您可以使用 DynamicObject 或Castle Proxy模拟类似的东西。您可以使用其中一种技术创建一个 AzureEntity,并生成一个与 Person 具有所有相同属性但它继承自 TableServiceEntity 的对象,而不是将 Person 保存到 azure。

TableServiceEntity 的事情,只是为了便于使用......你可以得到存储客户端库源代码(据我所知,它是在 git hub 或 codeplex 周围的某个地方发布的),并修改它以使其工作而不使用TableServiceEntity 的事情。

更新评论: 在您的情况下,您可以同时使用...不同之处在于,在 expando 对象中,您通过扩展定义对象,而动态对象由理解定义。动态对象更强大(也更复杂),但在这种情况下您不需要任何这些。顺便说一句:Castle Proxy 与动态对象方法非常相似,但它在运行时会生成大量代码,因此它可能会获得比动态对象或 expando 对象更好的性能。

进一步更新: 您可以让 expando 对象实现这样的接口

于 2012-07-20T03:55:42.770 回答