是否可以在运行时将命名空间动态更改为 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