我想阻止我的客户端通过构造函数实例化实体。 由于创建这些实体(初始化状态,集合等等)涉及相当多的pluming,并且WCF不能以这种方式工作,我想强制它们调用将在服务器端创建的方法实体并通过电线发送,如
客户方:
var client = EntityServiceClient("myEndpoint");
var newEntity = client.CreateEntity();
服务器端:
public Entity CreateEntity()
{
return new Entity();
}
我有一些工作,但我想以某种方式在使用实体的默认构造函数时抛出异常,或者将其设为私有。所以以下内容不应该起作用
客户方:
var client = EntityServiceClient("myEndpoint");
var newEntity = new Entity();
有可能吗?
答案 0 :(得分:2)
WCF的工作原理并不是真的如此,就客户端而言,序列化对象只包含数据而非行为,所以你应该发回DTO而不是实体。
但是,如果你坚持采用这种方法,这很可能会在将来给你带来麻烦,你可以移动你的物品。服务接口进入单独的类库并分发它,而不是让客户端在添加服务引用时从元数据生成代码。
答案 1 :(得分:1)
客户端的类(通常)是生成的代理。与服务器端不同,只是模拟。
在任何情况下,客户端的反序列化器都需要能够重新创建实体。 DataContractSerializer只是忽略你的私有构造函数并创建它自己的。
使用具有共享类型的库时,情况会略有变化。你可以做的最好的事情是制作c internal
并将工厂添加到库中。
总而言之,我认为这不是一个好主意。 Remmber,他的目标是WCF交换数据,而不是对象。
答案 2 :(得分:0)
你的问题对我来说真的不清楚 - 无论如何我会尽力帮助你并给你一些提示。 在你的情况下,我认为一种工厂是一种很好的方法。
在服务器端程序集中定义EntityServiceClient
和Entity
。注意,访问修饰符将阻止在此通过构造函数实例化Entity
:
public class EntityServiceClient
{
public EntityServiceClient(string endpoint)
{
// put here initializing code for your service client.
}
public Entity CreateEntity()
{
return new Entity(); // May here put your complexe code to initializing a new valid entity
}
}
public class Entity
{
internal Entity()
{
}
}