是否可以在运行时动态地将命名空间更改为ServiceContract?

时间:2012-05-14 15:00:50

标签: c# .net wcf

前:

[ServiceContract(Namespace = "@services.url@/",
        Name = "FedExContract")]

我需要在运行时更改“@ services.url @”的值。

2 个答案:

答案 0 :(得分:0)

除了使用条件编译符号之外别无其他想法,即

#if Debug 
[ServiceContract(Namespace = "@AA.BBB@/", Name = "FedExContract")]

#endif 

命名空间是静态的,因为如果更改合同的命名空间,可能需要重新创建客户端代理。

答案 1 :(得分:0)

您可以在运行时更改它。但这将是很多工作,它必须在服务开始之前发生。服务启动后,您无法修改合同信息。

我个人不喜欢依赖于DB的服务启动。如果出现问题,服务永远不会出现,故障排除对于IT来说可能是一个复杂的过程。如果我要去运行时路由,我会将命名空间值存储在配置文件中。只需保持简单,仍然可以像您在问题中描述的那样替换后部署令牌。

从评论中提到构建过程。这就是我们处理它的方式:使命名空间成为一个常量字符串。例如:

[DataContract(Namespace=Constants.CURRENT_NAMESPACE]
public class MyClass
{ }

现在在一个单独的文件中声明:

// in a separate file define:
public static class Constants
{
    public const string CURRENT_NAMESPACE = "url://Services";
};

如果要为不同的环境构建,请更换Constants文件以获取新定义:

//As a part of your build process switch the Constants file:
public static class Constants
{
    public const string CURRENT_NAMESPACE = "url://Eclipse/Services";
};

易于管理,您始终知道正在使用的命名空间......并且服务始终启动。这有用吗?