2012-07-20 72 views
3

我有一个类(人),这是我的MVVM应用程序模型。我想将此类保存到Azure表存储。要保存到Azure表存储,您需要从名为TableServiceEntity的类派生。我宁愿不要将我的好班级与用于存储的属性混为一谈(在考虑分离问题时似乎是一个好主意)。我可以让我的类在运行时从另一个类继承吗?

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

谢谢! Andy

+1

你总是可以挖成'System.Reflection.Emit',但我认为,创建一个新的类型在运行时可能不是最好的办法。 – cdhowie 2012-07-20 03:45:06

+0

我要么不会建议使用反射。这需要大量的您的应用程序性能明智 – Amit 2012-07-20 03:45:52

+0

@Amit不反射,代码排放。该名称空间包含可用于在运行时实时创建新类型的类型。你发出IL来创建方法,然后像任何其他类型一样进行JIT编译。一旦您完成创建与此API的类型,就好像它是由C#编译器编译它会执行完全一样的。 – cdhowie 2012-07-20 03:47:28

回答

1

你可以使用DynamicObject或Castle Proxy来模拟类似的东西。您可以使用其中一种技术创建AzureEntity,并生成一个与Person具有相同属性的对象,而不是从TableServiceEntity继承。

TableServiceEntity的事情,只是为了方便使用而完成的......您可以亲自使用存储客户端库源代码(根据我的记忆,这些代码发布在git hub或codeplex的某处),然后修改它在不使用TableServiceEntity的情况下工作。

更新评论: 在你的情况,你可以同时使用......不同的是,在Expando的对象,你的扩展定义对象,而动态对象是通过理解来定义。动态对象更强大一些(也更复杂),但在这种情况下,您不需要这些。 BTW:Castle Proxy与动态对象方法非常相似,但它在运行时会生成很多代码,所以它可能会实现比动态对象或expando对象更好的性能。

更多更新: 您可以使expando对象实现一个像this这样的接口。

+0

啊,好的。我只是在问dasblinkenlight关于使用Expando对象 - 我对DLR不是很熟悉,但认为可能有些东西。所以你认为我应该看起来比Expando对象更适合DynamicObject? – 2012-07-20 03:59:01

+0

这很完美 - 除了我认为由于您不仅仅需要从TableServiceEntity继承的属性来保存到Azure表中,您的类还需要使用以下属性进行修饰:“DataServiceKey(” PartitionKey“,”RowKey“)]。没有办法给expando对象一个属性,是吗? – 2012-07-20 04:38:02

+0

太好了,谢谢!这很有帮助。 – 2012-07-20 23:20:49

1

不幸的是,在C#中没有:继承是一个编译时的概念,所以你的对象必须在编译时从它的基类继承。至于“用代表存储的属性混淆你的代码”,部分类可以提供很大的帮助:将与存储相关的属性放在一个单独的文件中,并且你的代码将再次看起来很干净。

+0

感谢您的答案,人 - 只是下探每一种可能性 - 是有在DLR东西,像的expando对象,它可以让当我去保存它时,我会为班级添加必要的属性?或者,我可以采取的expando对象为在持续存储方法的参数,并且具有的expando对象继承TableServiceEntity类? DLR对我来说目前是一个模糊的概念,但我一直在为此考虑。 – 2012-07-20 03:50:59

+1

@AndrewBSchultz不能同时继承的expando对象和餐桌服务的实体,但你可以实现EXPANDO对象实现了'IDynamicMetaObjectProvider'界面,并将电话转接到一个嵌入式的expando对象。尽管如此,这对于在编译时继承来说并不是一个改进。 – dasblinkenlight 2012-07-20 03:59:34

1

听起来会比较简单,只是创建一个PersonTableServiceEntity类和静态方法您Person实体和PersonTableServiceEntity

2

你不能在运行时更改继承之间的转换。

您可以使用AutoMapper等工具从您的域对象映射到从TableServiceEntity派生的数据存储对象。

像Entity Framework Code First或NHibernate这样的O/R Mappers的好处之一是它们不会强制你从一个特殊的基类派生。

1

简短的回答 - 没有。这一切都在编译时在C#中完成。 Srry

1

如果可能的话,根本不知道,但它并没有像我一样可能。 只需创建一个PersonStorage类,以使用单个Person实例继承TableServiceEntity?

相关问题