我有一个代理类发出请求对象,并期望它们被传回给它,并将一些属性更改为明智的值。问题是,的消费者表示,券商必须从未更改该对象的一对夫妇的只读属性,也可以创建不同的请求实例作弊是只读保护或经纪人将打破,并抛出一个异常。如果代理的任何类保存尝试创建请求对象,我想找到一种方法来使编译失败。如何确保只有一个类可以创建一个A.B实例?
我认为密封请求对象的实例化,所以它只能从代理内部完成本身是一个整洁的想法,加上只读属性,所以请求处理器永远不会欺骗系统,但我很难做到这一点。我试过一个像这样的私人构造函数的子类:
public class PermissionsRequestBroker {
public PermissionsRequest Test() {
return new PermissionsRequest();
}
private class PermissionsRequest {
private PermissionsRequest() {
}
}
}
但它失败了,因为代理无法创建请求对象。
我尝试过类似的方法,但用的接口是这样的:
public class PermissionsRequestBroker {
public IPermissionsRequest Test() {
return new PermissionsRequest();
}
public interface IPermissionsRequest {
}
private class PermissionsRequest : IPermissionsRequest {
public PermissionsRequest() {
}
}
}
但请求处理器可以实现IPermissionsRequest和欺骗系统的方式。当然,我可以实现一个运行时检查,以便返回的对象仍然是代理的PermissionRequest对象,但这仍然是一个运行时检查,并会引发异常。
我所有的异常,但我觉得必须有某种方式来强制执行该合同在编译时,无需安装任何形式的IDE扩展或NuGet包。
什么问题是你想解决? “欺骗”是什么意思,你不相信你的图书馆的用户?你看过'sealed'关键字吗? – Aron
为什么你在第一个案例中使构造函数保密?在班级本身是私人的时候不会公开,而不是公开解决你的问题? – Madhusudhan
@Aron PermissionRequest实例具有绝对不能更改的RequestId属性。IE:如果经纪人向您发送一个带有Id:0的请求,那么经纪人会希望您使用同一个ID回复,否则经纪人本身会中断并回复不同的请求源。 – Machinarius