1

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

客户端:

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

服务器端:

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

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

客户端:

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

有可能吗?

4

3 回答 3

2

这并不是 WCF 的真正设计方式,就客户端而言,序列化对象仅包含数据而不是行为,因此您应该发回 DTO 而不是实体。

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

于 2012-10-24T20:05:12.540 回答
1

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

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

当您使用具有共享类型的库时,情况会略有变化。那么你能做的最好的事情就是制作 ctorinternal并将工厂也添加到库中。

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

于 2012-10-24T19:31:20.500 回答
0

你的问题对我来说真的很不清楚 - 无论如何我会尽力帮助你并给你一些提示。在你的情况下,我认为一种工厂是一种很好的方法。

在服务器端程序集中定义一个EntityServiceClientEntity。请注意,访问修饰符将阻止此处Entity通过构造函数实例化 a:

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()
    {

    }
}
于 2012-10-24T19:31:46.807 回答