我有一个使用Thing
从JSON文件反序列化的类DataContractJsonSerializer
:
[DataContract]
class Thing
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string Name { get; set; }
// and so on...
}
要使此功能正常运行,所有属性都必须包含public
或至少internal
个设置者。
另外两个模块(程序集)需要访问此类:
ThingView
应具有对大多数属性的只读权限。ThingEditor
需要完全访问所有属性。我可以设置制定者internal
,但ThingEditor
无法获得完全访问权限。
要限制对ThingView
类的访问,我能想到的最好的想法是创建Thing
类的只读包装器。但这会涉及大量的代码重复。
在这种情况下,是否有更好的方法可以实现更多的封装?
(实际代码包含大约20个此类型的类,其中一些形成嵌套结构。另外,有两个以上的模块需要读取或完全访问属性。)
答案 0 :(得分:1)
规范中没有开箱即用的功能。但是,你可以做这样的事情,例如
public interface IReadOnlInterface
{
int Id { get; }
string Name { get; }
}
public interface IInterface
{
int Id { get; set; }
string Name { get; set; }
}
internal class Thing : IInterface , IReadOnlInterface
{
public int Id { get; set; }
public string Name { get; set; }
}
但是没有什么可以阻止编码器将脏小的手指投射到另一个界面。如果它只是一个运行时问题,那么接口应该没问题。否则你将不得不用安全数据创建一个更好的api设计,以及具有只读访问权限的代理类型对象,尽管可能有人有更好的想法。