【发布时间】:2014-04-18 03:28:59
【问题描述】:
我有一些 DTO 类应该像这样实现:
public class City
{
public string Name { get; set; }
public State State { get; set; }
}
public class State
{
public string Name { get; set; }
}
问题是,这些实际上是 REST XML 资源的 DTO 类。 City 资源可能包含内联的 State 资源,或者它可能只是提供资源 ID(一个 URI)。我正在通过存储库模式处理对 DTO 的访问,并希望它对客户端透明,无论 State 是否延迟加载(就像 NHibernate 如何处理它的实体类一样)。
所以我目前的计划是在 REST 存储库检测到该类没有完全“水合”(即并非所有内容都是内联的)时,使用 Castle DynamicProxy 创建一个代理对象。代理对象将知道如何根据需要延迟加载属性。
然而,要实际实现这一点,我想出的唯一方法是为所有关系设置支持属性并将 Xml 属性放在这些关系上。所以策略看起来像这样:
[XmlType]
public class City
{
[XmlElement]
public string Name { get; set; }
[ToOneRestRelationship(BackingPropertyName = "StateBacking")]
public State State { get; set; }
[XmlElement(Name = "state")]
public ResourceBase StateBacking { get; set; }
}
[XmlType]
public class State
{
[XmlElement]
public string Name { get; set; }
}
然后 Repository 对象知道设置代理对象以从 StateBacking 属性获取对象并使用该对象(内联资源案例)或执行 REST 请求以延迟检索 State 对象(资源 URI 案例,即懒惰)来自支持属性中指定的 ID。
问题
问题是,这个支持字段非常难看。我想要一种让Castle 生成一个类的方法,该类将具有支持属性应用XmlElement 属性,我可以将其传递给XmlSerializer。然后我的 DTO 类可能看起来更像第一个示例,并且不必知道实际的序列化类具有支持属性。
Castle 或任何其他代理库是否可以实现类似的功能?
【问题讨论】:
标签: c# xml proxy castle-dynamicproxy