问题: 如何使代码在本地运行时与在生产环境中相比在生产中表现不同?
实施例: 在ASP.NET MVC应用程序中,我设置了一个控制器来提供电子邮件通知。在开发计算机上运行本地时,我希望将电子邮件发送给开发人员,在 QA 时,我不希望任何电子邮件通知发送到< strong>生产我希望通知发送给目标收件人
由于
答案 0 :(得分:4)
有三个不同的web.configs并添加一个AppSetting,告诉你你在哪里,这样你就可以确定是否应该发送电子邮件。
您还可以使用CompilerOptions属性在web.config中定义常量:
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs"
type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089"
compilerOptions="/d:Test"/>
</compilers>
</system.codedom>
在您的代码中使用
#if !Test
SendMail();
#endif
答案 1 :(得分:4)
这听起来像是你应该用IoC做的事情。我通常使用StructureMap来允许我设置不同的配置文件。然后,我所要做的就是配置一个web.config开关来设置适当的环境配置文件。
例如,在StructureMap中,您可以执行以下操作:
ObjectFactory.Initialize( x => {
x.CreateProfile( "Development", p =>
{
p.Type<IEmailProvider>().Is.OfConcreteType<DeveloperEmailProvider>();
} );
x.CreateProfile( "QA", p =>
{
p.Type<IEmailProvider>().Is.OfConcreteType<NullEmailProvider>();
} );
x.CreateProfile( "Production", p =>
{
p.Type<IEmailProvider>().Is.OfConcreteType<ProductionEmailProvider>();
} );
} );
ObjectFactory.Profile = ConfigurationSettings.AppSettings["Profile"];
答案 2 :(得分:2)
对于轻量级项目,我只使用AppSetting值,然后对所有电子邮件,通过以下消息传递收件人地址:
public static MailAddress MailTo(string email) { if (Boolean.Parse(ConfigurationManager.AppSettings["RedirectEmails"])) { return new MailAddress(ConfigurationManager.AppSettings["DebugMailbox"]); } return new MailAddress(email); }
我们的大型项目使用NAnt构建脚本,它使用模板配置文件为不同的构建目标生成不同的配置(因此您有一个Web.Config.template文件,该文件与local.properties,test.properties合并或者release.properties包含相关变量的XML文件。)
答案 3 :(得分:1)
我会为System.Net.Mail发送电子邮件的环境配置不同的web.config。看看Scott Gu的blog post。对于开发,我会把它放在服务器上的电子邮件中。对于 QA ,请不要在任何地方发送任何内容,并且生产将其配置为使用普通SMTP服务器。
答案 4 :(得分:1)
我认为IoC的答案是一个很好的通用解决方案。对于直接发送到SMTP服务器的电子邮件的具体情况,您可以在此处使用配置解决方案:How can I save an email instead of sending when using SmtpClient?。配置解决方案快速而便宜,特别是如果开发团队在IoC上不大的话。
我见过的项目虽然在另一台进行电子邮件处理的机器上有中间服务。在这种情况下,配置解决方案不起作用。
答案 5 :(得分:0)
我是在最近的一个项目中做到的。我的解决方案非常复杂,但简而言之,有两个控制它的Web.config键:EmailTestMode和EmailEnabled。如果启用了EmailTestMode,则会生成消息,但会将消息发送到特定地址而不是其预期收件人。如果EmailEnabled已关闭,则会记录消息但不会发送消息。
我遇到了构建一个管理这些项目的Messenger类的麻烦 - 我只是调用一个具有消息的各种属性的方法,并确定是否以及在何处发送它。我在Web.config中也有一个单独的配置块,它包含所有系统消息。这样,可以从配置文件轻松修改发件人,收件人,主题和正文。在大多数情况下,正文由应用程序生成或使用String.Format()来填充值。
答案 6 :(得分:0)
就像其他人所说的那样,在web.config中使用不同的Application Settings。然后,您的运行时代码可以使用正确的设置版本。
另一种很酷的方法是使用Conditional Attributes来构建和调用方法的调试版本。
答案 7 :(得分:0)
我使用我的版本控制软件为我做这个。基本上我的每个环境都有多个web.config文件(dev,test,qa,prod)。现在在版本控制软件中,我标记了正确环境的所有文件。因此,当我需要构建qa环境时,我会将所有文件标记为“QA”,依此类推。
答案 8 :(得分:0)
我们这样做的方法是在machine.config
中有两个配置键 ProductionServers = “PROD_SERVER”
TestServers = “LOCAL_MACHINE | TEST_SERVER”
然后我们有一个测试机器名称(System.Environment.MachineName)与这些值的函数。这样我们就不必更改服务器上的任何配置,当我们想要指向prod而不是测试时,我们只需更改本地machine.config。