【发布时间】:2011-04-19 10:26:17
【问题描述】:
我正在编写一个在 .net 和 silverlight 之间共享的库。我有几个地方正在这样做,以满足 silverlight 反序列化(无法访问私有成员):
[DataMember (IsRequired = true)]
public Object MyProperty { get;
#if SILVERLIGHT
internal
#else
private
#endif
set; }
我知道这方面的规则,如果设置器是私有的并且定义了 SILVERLIGHT,那么设置器应该是内部的。
我可以使用像 postsharp 这样的面向方面的框架来帮助我减少此代码,这样我就不需要指定任何内容并且它会检查属性,如果它具有 DataMember 属性并且 setter 是私有的,那么将改为内部设置?
或者我可以使用其他一些技术吗?
编辑
似乎有些混乱。我的目标是完全避免使用编译器指令,但仍然拥有使用 .net 中的私有成员生成的代码以及可以由 Silverlight 中的DataContractDeserializer 设置的成员,不能访问私有成员。如果可能的话,我想在 silverlight 构建中自动修改属性,使其成为内部属性,同时在源代码中除了 DataMember 属性之外没有任何其他属性。
理想情况下,我认为解决方案类似于:
- 编写一个检查每个属性或字段的切面。
- 如果属性/字段具有
[DataMember]属性,则- 如果 silverlight 编译器指令存在,则
- 如果 setter 是私有的,让它成为内部的(对于属性),或者如果它被声明为私有的,让它成为内部的(对于字段)
- 如果 silverlight 编译器指令存在,则
但我不确定使用 post sharp 之类的工具可以做到哪些方面。
【问题讨论】:
-
这样做会导致潜在问题吗?这些成员不能在课堂外访问吗?内部 = 对程序集公开,而私有意味着只有类可以访问。
-
@DustinDavis 因为 same 代码由 .net 和 silverlight 编译,任何使用内部变量的地方都不会在 .net 构建中编译,就像在那个构建中一样它是私人的。开发人员必须在
#if SILVERLIGHT编译器指令中使用该属性,以免引起问题,他们可以这样做,但不太可能 -
很多人尝试这样做,但我不知道为什么。只需使用共享代码(尽可能多地)使用不同的程序集。你正在以一种可怕的方式编写代码。
-
@Sam 您需要使用 DTO,因此您不必拥有私人/内部成员。 DTO 是数据的轻量级版本,并且总是(通常)使用公共属性。不要传递您的模型或业务对象。有关属性注入的示例,请参见下面的答案
-
始终使用 DTO 传输数据/对象,然后根据需要使用它们。如果这需要构建业务对象,那就这样吧。然后,您将您的服务与您想要的客户分离。您的服务和客户端不需要了解彼此的任何信息,除了公共接口(使用 DTO),它只有确切需要的成员,仅此而已。
标签: c# shared-libraries aop postsharp