【发布时间】:2010-09-07 17:27:26
【问题描述】:
考虑以下简化场景:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
// restricted
public string SocialSecurityNumber { get; set; }
// restricted
public string MothersMaidenName { get; set; }
}
因此,在应用程序中,许多用户可以查看Person 数据。部分用户可以查看全部;其他用户只能查看Name 和Age。
让 UI 仅显示授权数据在客户端很容易,但我真的不想将该数据发送到客户端。
我试图通过创建FullPerson : BasicPerson 层次结构(每类层次结构表)来实现这一点。我使用了 StaffRepository 的两个实现来获得所需的类型,但是由于 NH 代理,必要的转换在运行时失败。当然,在 RDBMS 中,People 表中的任何给定行都可以表示FullPerson 或BasicPerson,并且给它们两个相同的鉴别器值也不起作用。
我考虑只映射FullPerson 并使用AliasToBean 结果转换器过滤到BasicPerson,但我理解这是一条单向街道,而我想要实体管理和延迟加载的全部好处(虽然上面的示例不包括集合)在会话中。
我的另一个想法是将所有受限制的字段包装到一个类中并将其添加为属性。我对这种方法的担忧有几个:
- 它破坏了我的域模型,
- 我必须将该属性声明为一个集合(始终为 1)才能使其延迟加载,并且
- 我什至不确定如何防止加载该惰性集合。
这一切都感觉不对劲。是否有已知的方法来达到预期的结果?
澄清:
这在仅限 Intranet 的桌面应用程序中;会话存在于客户端上。虽然我当然可以创建一个中间服务层,但我必须放弃延迟加载和更改跟踪,我真的很想保留这些。
【问题讨论】:
标签: c# nhibernate domain-driven-design nhibernate-mapping smartclient