使实体的构造函数成为私有的

时间:2012-10-24 19:00:47

标签: c# .net wcf

我想阻止我的客户端通过构造函数实例化实体。 由于创建这些实体(初始化状态,集合等等)涉及相当多的pluming,并且WCF不能以这种方式工作,我想强制它们调用将在服务器端创建的方法实体并通过电线发送,如

客户方:

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

服务器端:

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

我有一些工作,但我想以某种方式在使用实体的默认构造函数时抛出异常,或者将其设为私有。所以以下内容不应该起作用

客户方:

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

有可能吗?

3 个答案:

答案 0 :(得分:2)

WCF的工作原理并不是真的如此,就客户端而言,序列化对象只包含数据而非行为,所以你应该发回DTO而不是实体。

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

答案 1 :(得分:1)

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

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

使用具有共享类型的库时,情况会略有变化。你可以做的最好的事情是制作c internal并将工厂添加到库中。

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

答案 2 :(得分: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()
    {

    }
}