在某些情况下,部署的环境(例如,开发、测试或生产)可能会决定某些操作的结果。
例如,一个成功的“用户注册”过程可能会向新用户发送通知电子邮件。具体环境行动:
下面我列举了三种可能的解决方案。
解决这一问题的一种方法是具有一些配置值(无论是在某个xml文件中还是在数据库中),比如CurrentEnvironment,它指定了系统部署到的当前环境。这将需要在代码中检查case/if以确定所需的操作:
if(CurrentEnvironment == Environment.Test)
{
// Send all emails to some testEnvironment@domain.com inbox.
}
else if(CurrentEnvironment == Environment.Production)
{
// Send the email to the user.
}在我看来,这不是一个可维护的解决方案。
另一种方法是在还原数据库后运行更改脚本,以执行以下操作:
这是发布过程中的一个额外步骤,如果错过了,可能会产生一些危险的结果。此外,此解决方案只解决电子邮件问题。也许还有许多其他情况下环境很重要。
另一个想法是使用web.config变换。这样,配置就可以在不同的环境中有所不同。例如,我们将有以下内容:
web.config
web.Development.config
web.Test.config
web.Production.config然后,转换可以使用不同的“提供者”,或者根据环境设置某些属性。例如,可以在overrideDeliveryAddress中设置web.Test.config:
<EmailService>
<providers>
<add
name="EmailServiceProvider"
type="CustomProviders.EmailServiceProvider, CustomProviders"
smtp="smtp.domain.com" password="xyz"
overrideDeliveryAddress="testEnvironment@domain.com"
enabled="true"
/>
</providers>
</EmailService>这个解决方案需要更多的工作,但维护性更强,侵入性更小。代码现在是环境--不经意。
实现上述目标的其他途径有哪些?代码是否应该具有环境意识?
发布于 2014-04-11 08:37:56
首先,您不应该在开发或测试中使用真实的生产数据(特别是与人员无关的数据)(当然,您可以使用从生产数据中精心选择的摘录)。因此,您的数据池(可能是数据库,可能是一个文件池,可能是两者兼而有之)应该在这些环境之间分离。因此,唯一需要更改的是在这3个数据池之间切换的配置文件(例如,数据库连接字符串或文件路径)。这意味着不需要任何“环境感知代码”,唯一能感知到环境的是主配置文件中的条目。
例如,您的开发环境应该有一个带有电子邮件附件列表的开发数据库,您的测试环境应该有一个不同的数据库和一个不同的列表,而您的生产环境应该是一个带有真实邮件附件的数据库。
您所描述的问题似乎是这样一种情况,您试图将生产数据库的副本加载到您的开发环境中,并用它替换您的开发数据库。这很可能是您应该避免的一种情况,最好提供导入/导出机制,以便将一小部分数据从一个数据库传输到另一个数据库,而在该数据库中,通常不传输个人数据。如果开发环境中确实需要生产DB的原始副本(因为否则无法复制某个bug),请使用解决方案2删除或匿名任何个人数据(在许多情况下,您必须这样做是出于隐私的原因)。
发布于 2014-04-11 11:57:39
我将提出一种基于依赖注入和Null对象的方法。如果您让您的配置在每个环境中定义应该用于特定任务的对象,那么可以在这些对象中定义特定的行为。然后,根据环境的不同,使用工厂初始化对象。
我将以邮件为例,但此方法可应用于许多其他上下文:日志、错误消息、与外部API的通信等。null mailer将是一个对象,它的接口与通常的mailer相同,并且只会忽略发送邮件指令。需要发送电子邮件的对象将具有在对象实例化时初始化的mailer参数:在您的生产环境中,您的mailer将是您通常的mailer。在您的测试环境中,您的邮件程序将是null (“不做任何事情”) mailer。
若要根据工作环境管理对象的实例化,请构建一个读取配置文件的工厂对象,并返回邮件器(记录器、api库.)取决于那里指定的内容。您可能对每个环境都有一个配置文件。
发布于 2015-05-27 10:35:27
代码不应该是环境意识,这就是为什么我们有倾诉。此外,您通常不希望将您的代码与开发秘密(DB连接字符串等)一起传送。或者,有时让开发人员访问生产秘密是不可取的。
虽然这是编程中的一项典型任务,但是要为不同的环境进行单独的配置,我们没有通用的解决方案、工具或过程来解决这个问题。我更喜欢配置复制或转换,您已经提到过了。
https://softwareengineering.stackexchange.com/questions/235618
复制相似问题