ASP.NET MVC - 如何使代码在本地运行时的行为与在QA和生产中的行为不同

时间:2010-01-07 18:30:15

标签: asp.net-mvc configuration debugging qa production

问题: 如何使代码在本地运行时与在生产环境中相比在生产中表现不同?

实施例: 在ASP.NET MVC应用程序中,我设置了一个控制器来提供电子邮件通知。在开发计算机上运行本地时,我希望将电子邮件发送给开发人员,在 QA 时,我不希望任何电子邮件通知发送到< strong>生产我希望通知发送给目标收件人

由于

9 个答案:

答案 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。