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

Posted

技术标签:

【中文标题】是否可以在运行时将命名空间动态更改为 ServiceContract?【英文标题】:Is it possible to dynamically change namespace to ServiceContract during runtime? 【发布时间】:2012-05-22 02:07:06 【问题描述】:

例如:

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

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

【问题讨论】:

为什么你需要在运行时改变命名空间? 这是为了支持现有的一些流程。我的客户正在使用 Eclipse 将服务发布到 IIS,并在构建期间替换这些标签。我计划将所有这些值移植到数据库而不是构建过程。 我无法想象这是可能的,我的意思是实际上它是如何工作的?命名空间什么时候会改变?它会在每次调用服务时检查吗?当服务重新启动时,我只能看到一些工作,也许你可以从数据库中读取一些东西,但这在运行时仍然没有改变,只是在启动时刷新。您当前的程序在运行时没有改变,所以我不确定为什么现在需要这样做。 山姆你说得有道理!我不认为从 db dring 运行时填充它是可行的。我只是不喜欢它作为构建过程的一部分。 你可以在启动时从配置文件中读取它吗?这会有帮助吗? 【参考方案1】:

除了使用条件编译符号之外想不到任何其他方法,即

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

#endif 

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

【讨论】:

可能这是唯一的选择。【参考方案2】:

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

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

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

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

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

// in a separate file define:
public static class Constants

    public const string CURRENT_NAMESPACE = "url://Services";
;

当您想为不同的环境构建时,将常量文件换成新定义:

//As a part of your build process switch the Constants file:
public static class Constants

    public const string CURRENT_NAMESPACE = "url://Eclipse/Services";
;

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

【讨论】:

我们做类似的事情。有没有办法可以从 MS Build 而不是使用 Eclipse/Ant 来完成? 我确定有,但我不是问这个问题的合适人选。可能是一个很好的第二个问题。

以上是关于是否可以在运行时将命名空间动态更改为 ServiceContract?的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时将 UITableViewCell 从启用更改为禁用,使其文本从黑色变为灰色?

使用 npx install react-create-app 时将 yarn 更改为 npm

Qt Creator - UI 类的自定义命名空间

具有动态命名空间的 Oracle 提取值

iOS 9 Safari:滚动时将元素更改为固定位置在滚动停止之前不会绘制

将 App_Start 更改为 AppStart