ASP.NET MVC - Как заставить код вести себя по-разному при локальном запуске и в QA и в производстве - PullRequest
2 голосов
/ 07 января 2010

Вопрос: Как заставить код вести себя по-разному при локальном запуске и в QA и в производстве?

Пример: В приложении ASP.NET MVC у меня есть контроллер, настроенный для доставки уведомлений по электронной почте. При запуске локально на компьютере разработчика я хочу, чтобы электронные письма доставлялись разработчику, когда в QA я не хочу, чтобы какие-либо уведомления по электронной почте отправлялись и в Производство Я хочу, чтобы уведомления отправлялись их предполагаемым получателям

Спасибо

Ответы [ 9 ]

4 голосов
/ 07 января 2010

Это звучит как то, что вы должны делать с помощью 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"];
4 голосов
/ 07 января 2010

Имеется три различных файла web.configs и добавьте AppSetting, который сообщит вам, где вы находитесь, чтобы вы могли определить, следует ли отправлять электронное письмо.

Вы также можете определить константы в вашем файле web.config, используя атрибут CompilerOptions:

<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
2 голосов
/ 07 января 2010

Для облегченных проектов я просто использую значение 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, содержащий соответствующие переменные).

1 голос
/ 07 января 2010

Я думаю, что ответ IoC - хорошее общее решение. Для конкретного случая, когда электронные письма отправляются непосредственно на SMTP-сервер, вы можете вместо этого использовать конфигурационное решение здесь: Как сохранить электронную почту вместо отправки при использовании SmtpClient? . Конфигурационное решение быстро и дешево, особенно если команда разработчиков не слишком хороша в IoC.

Я видел проекты, где на другом компьютере есть промежуточный сервис, который выполняет обработку электронной почты. В этом случае решение для конфигурации не работает.

1 голос
/ 07 января 2010

Я бы настроил web.config по-разному для сред, в которых System.Net.Mail отправляет электронные письма. Взгляните на сообщение в блоге Скотта Гу об этом. Для Development я бы хотел, чтобы он где-то сбрасывал электронные письма на сервере. Для QA не отправляйте его никуда, а для Production настройте его на использование обычного SMTP-сервера.

0 голосов
/ 07 января 2010

То, как мы это делаем, состоит в том, чтобы в нашей машине было два конфигурационных ключа .config

ProductionServers = "PROD_SERVER"
TestServers = "LOCAL_MACHINE | TEST_SERVER"

Затем у нас есть функция, которая проверяет имя компьютера (System.Environment.MachineName) в сравнении с этими значениями. Таким образом, нам никогда не придется изменять какие-либо конфиги на серверах, и когда мы хотим указать на prod вместо test, мы просто меняем наш локальный machine.config.

0 голосов
/ 07 января 2010

Я использую свое программное обеспечение для контроля версий, чтобы сделать это для меня. В основном у меня есть несколько файлов web.config для каждой из моих сред (dev, test, qa, prod). Теперь в программном обеспечении контроля версий я отмечаю все файлы для правильной среды. Поэтому, когда мне нужно построить среду qa, я получаю все файлы с тегом "QA" и т. Д.

0 голосов
/ 07 января 2010

Как уже говорили другие, используйте Настройки приложения в вашем web.config. Ваш код времени выполнения может затем использовать правильную версию ваших настроек.

Еще один крутой способ сделать это - использовать Условные атрибуты для создания и вызова отладочных версий ваших методов.

0 голосов
/ 07 января 2010

Я сделал это на недавнем проекте. Мое решение довольно сложное, но в двух словах есть два ключа Web.config, которые управляют этим: EmailTestMode и EmailEnabled. Если EmailTestMode включен, сообщения генерируются, но отправляются на определенный адрес, а не на предполагаемого получателя. Если EmailEnabled выключен, сообщения регистрируются, но не отправляются.

Я столкнулся с проблемой создания класса Messenger, который управляет этими элементами для меня - я просто вызываю метод с различными атрибутами сообщения, и он выясняет, нужно ли и куда его отправлять. У меня также есть отдельный блок конфигурации в Web.config, который содержит все системные сообщения. Таким образом, отправитель, получатель, тема и тело могут быть легко изменены из файла конфигурации. В большинстве случаев тело либо создается приложением, либо использует String.Format () для заполнения значений.

...