1

我有一个内部 API,我希望其他人在他们的项目中将其作为已编译的 DLL 引用。当它是引用的独立项目时,我使用条件编译(#if 语句)根据编译符号切换关键 Web 服务类的行为。问题是,一旦生成了一个程序集,它似乎被锁定在最初编译时的任何编译符号中 - 例如,如果这个程序集是用 DEBUG 编译的并且被另一个项目引用,即使另一个项目是作为 RELEASE 构建,程序集仍然像在 DEBUG 中一样运行,因为它不需要重新编译。这是有道理的,只是提供一些背景。

现在我正在尝试解决这个问题,以便可以通过其他方式切换程序集的行为,例如扫描 app/web 配置文件中的开关。问题是,我在其中切换的一些程序集代码是方法的属性,例如:

#if PRODUCTION
        [SoapDocumentMethodAttribute("https://prodServer/Service_Test", RequestNamespace = "https://prodServer", ResponseNamespace = "https://prodServer")]
#else
        [SoapDocumentMethodAttribute("https://devServer/Service_Test", RequestNamespace = "https://devServer", ResponseNamespace = "https://devServer")]
#endif
        public string Service_Test()
        {
            // test service
        }

虽然可能有一些语法糖允许我以另一种方式在相同类型的两个属性之间切换,但我不知道。有任何想法吗?

另一种方法是引用整个项目而不是程序集,但如果可以的话,我宁愿坚持只引用已编译的 DLL。如果需要的话,我也完全愿意采用一种全新的方法来解决问题。

4

3 回答 3

6

你不需要这样做。这些 URL 不是“真正的” URL——它们不代表 Internet 上的位置。它们仅用于使名称独一无二。

您应该为开发使用与生产相同的命名空间名称。

于 2010-05-12T16:38:22.323 回答
2

问题是,这些#if语句仅在编译期间运行。一旦你有一个编译的程序集 - 它会坚持它所拥有的......其余的代码将从程序集中被剥离:)

如果您希望测试/生产的 URL 不同,您应该创建一个新属性,该属性派生自 SoapDocumentMethodAttribute,并根据您的 AppSetting 值设置这些值:)

于 2010-05-12T16:39:50.247 回答
-1

好吧,好吧-首先,编译后显然有条件编译保持在原位。你到底是怎么得到这个想法的?这是一个条件编译。

您可以通过反射修复的属性 - 您可以“覆盖”反射以在那里返回您自己的信息。这很棘手,但有可能(与您可以将属性“注入”到反射代码中的方式相同)。不过,我不确定我是否希望这种情况发生。基本上......你应该得到类似服务器 URL 的东西,而不是来自反射,而是来自配置文件。错误的方法,我会说。

于 2010-05-12T16:34:53.440 回答