2012-10-24 160 views
1

我想阻止我的客户端通过构造函数实例化实体。 由于创建这些实体需要相当多的插入操作(初始化状态,集合等),而WCF不能这样工作,所以我想强制他们在服务器端调用一个方法,创建实体,并把它通过线路,像使实体的构造函数私有

客户端:

var client = EntityServiceClient("myEndpoint"); 
var newEntity = client.CreateEntity(); 

服务器端:

public Entity CreateEntity() 
{ 
    return new Entity(); 
} 

我有什么工作,但我想以某种方式抛出一个异常当enti的默认构造函数ty被使用,或者是私人的。所以下面不应该工作

客户端:

var client = EntityServiceClient("myEndpoint"); 
var newEntity = new Entity(); 

有什么事情可能吗?

+0

我不完全理解这个问题。你可以说得更详细点吗? =( – Gaspa79

+0

使你的实体类变得私人化 –

+0

一个类不需要默认的ctor,你可以使用内部的ctor – Paparazzi

回答

2

这不是真的怎么WCF的设计工作,序列化对象至于客户而言只包含数据未行为,以便你应该发回DTO的不是实体。

但是,如果你坚持采用这种方法,这很可能会在将来给你带来麻烦,你可以将你的对象服务接口移动到一个单独的类库中并分发它,而不是让客户端从元数据中生成代码添加服务引用时。

+0

完全看到你的观点,而事实上那不是我想要的方式。 – Seb

1

客户端的类通常是生成的代理。与服务器端不同,只是一个模拟。

在任何情况下,客户端的解串器都需要能够重新创建实体。 DataContractSerializer只是简单地忽略你的私有构造函数并创建它自己的构造函数。

当您使用具有共享类型的库时,情况稍有变化。那么你可以做的最好的方法就是制作文件internal并将Factory添加到库中。

总而言之,我认为这不是一个好主意。 Remmber,他WCF的目标是交换数据,而不是对象

+0

这不完全准确,虽然它不会调用你的构造函数,但它本身并不实际创建一个它调用FormatterServices.GetUninitializedObject(type)来创建实例,而不调用构造函数或字段初始化器。 –

+0

@TrevorPilley - 客户端代码将能够执行'var p = new ClassWithPrivateCtor();'。 –

+0

是的,如果这些类是从元数据中产生的,那么我并不是在暗示我正在纠正您关于数据协定序列化程序创建它自己的构造函数的陈述。 –

0

你的问题对我来说真的不清楚 - 无论如何,我会尽力帮助你并给你一些提示。 就你而言,我认为一种工厂是一种好方法。在服务器端组件中定义EntityServiceClientEntity。注意,访问修饰符,这里将防止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() 
    { 

    } 
} 
+0

但是,这应该是服务器还是客户端工厂?或两者? –

+0

这取决于客户端 - 服务器的体系结构。在这个问题上,它真的不清楚哪里是什么... –

+0

对不起,我的代码不清楚,我错过了一个“新”创建的客户端应该读取'var client = new EntityServiceClient(“endpointName”);' 我醉了那一天...... – Seb