2

質問: ローカルで実行する場合と QA で実行する場合と本番環境で実行する場合で、コードの動作を変えるにはどうすればよいですか?

例: ASP.NET MVC アプリケーションで、電子メール通知を配信するようにコントローラーをセットアップしました。開発マシンでローカルに実行している場合は、電子メールを開発者に配信したいのですが、 QAでは電子メール通知を送信したくなく、本番環境では意図した受信者に通知を送信したいと考えています。

ありがとう

4

9 に答える 9

4

3 つの異なる web.config を用意し、現在の場所を示す 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
于 2010-01-07T18:37:29.430 に答える
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"];
于 2010-01-07T18:38:27.430 に答える
3

軽量プロジェクトの場合、AppSetting 値を使用するだけで、すべての電子メールについて、次のメッセージで受信者アドレスを渡します。

public static MailAddress MailTo(文字列メール)
{
    if (Boolean.Parse(ConfigurationManager.AppSettings["RedirectEmails"]))
    {
        return new MailAddress(ConfigurationManager.AppSettings["DebugMailbox"]);
    }

    新しいMailAddress(電子メール)を返します。
}

私たちの大規模なプロジェクトでは、NAnt ビルド スクリプトを使用します。これは、テンプレート構成ファイルを使用して、さまざまなビルド ターゲットに対して異なる構成を生成します (したがって、local.properties、test.properties、またはリリースのいずれかとマージされる Web.Config.template ファイルがあります)。関連する変数を含むプロパティ XML ファイル)。

于 2010-01-07T18:46:37.863 に答える
1

System.Net.Mail が電子メールを送信する方法の環境では、web.config を別の方法で構成します。これについては、Scott Gu のブログ投稿をご覧ください。Developmentの場合、サーバーのどこかにメールをドロップします。QAの場合、どこにも何も送信しないようにし、本番の場合は通常の SMTP サーバーを使用するように構成します。

于 2010-01-07T18:54:19.773 に答える
1

IoCの答えは良い一般的な解決策だと思います。電子メールが SMTP サーバーに直接送信される特定のケースでは、代わりに次の構成ソリューションを使用できます。. 構成ソリューションは、特に開発チームが IoC にあまり詳しくない場合、迅速かつ安価です。

メール処理を行う別のマシンに中間サービスがあるプロジェクトを見てきました。この場合、構成ソリューションは機能しません。

于 2010-01-07T18:58:16.190 に答える
0

バージョン管理ソフトウェアを使用してこれを行います。基本的に、環境 (dev、test、qa、prod) ごとに複数の web.config ファイルがあります。バージョン管理ソフトウェアで、すべてのファイルに正しい環境のタグを付けます。したがって、qa環境を構築する必要がある場合、「QA」などのタグが付けられたすべてのファイルを取得します。

于 2010-01-07T19:33:37.697 に答える
0

私は最近のプロジェクトでこれを行いました。私のソリューションはかなり複雑ですが、一言で言えば、これを制御する Web.config キーが 2 つあります。EmailTestMode と EmailEnabled です。EmailTestMode がオンの場合、メッセージは生成されますが、意図した受信者ではなく特定のアドレスに送信されます。EmailEnabled がオフの場合、メッセージはログに記録されますが、送信されません。

これらのアイテムを管理する Messenger クラスを作成するのに苦労しました。メッセージのさまざまな属性を指定してメソッドを呼び出すだけで、メッセージを送信するかどうか、送信先を決定します。また、Web.config には、すべてのシステム メッセージを含む別の構成ブロックがあります。このようにして、送信者、受信者、件名、および本文を構成ファイルから簡単に変更できます。ほとんどの場合、本文はアプリによって生成されるか、String.Format() を使用して値を入力します。

于 2010-01-07T18:37:07.060 に答える
0

これを行う方法は、machine.config に 2 つの構成キーを含めることです。

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

次に、マシン名 (System.Environment.MachineName) とそれらの値をテストする関数があります。そうすれば、サーバー上の構成を変更する必要がなくなり、テストではなく製品を指定したい場合は、ローカルの machine.config を変更するだけです。

于 2010-01-07T19:48:26.243 に答える
0

他の人が言ったように、web.config で異なるアプリケーション設定を使用してください。その後、ランタイム コードで正しいバージョンの設定を使用できます。

これを行うもう 1 つの優れた方法は、条件付き属性を使用して、メソッドのデバッグ バージョンをビルドおよび呼び出すことです。

于 2010-01-07T18:55:40.827 に答える