.NETで作る!

.NETに関するあれこれ(C#、VB.NET)

MEnvironment で環境(開発、実行etc)定数を一発切り替えする

重要

Unity+app.configでIDbConnectionをインスタンスする - VB.NETで作る!

こちらの記事を参考に実装されることをお勧めします。

どうしても読みたいという方は続きへどうぞ

MEnvironment は自作クラスです。 VBソースコード1ファイルをNuget形式で配布しています。(いまんところ公式のNugetサーバーにはアップしていません)

背景

システムで用いる定数は「開発」、「本番」などの実行環境に合わせて変更することが多くあります。 これは「ソースコードコメントアウトする」などのような力技で実現は可能ですが、

  • (保守面では)切り替えるべき定数が把握しづらい
  • (定数が複数あると)切り替え漏れが起きやすい
  • (片方しか記述していないと)開発なのか本番なのか区別しづらい

などの問題があり、要らぬトラブルを招くことになります。

使い方

Sub Main()
    Dim env As Environment = MEnvirionment.Current
    'TODO
End Sub

Currentプロパティがコールされたとき、「MEnvironment.config」ファイルが逆シリアル化され、実行環境の定数へアクセスできるようになります。

「MEnvironment.config」ファイルが存在しない場合、MEnvironment クラスの OnInitialize メソッドがコールされ、 初期化された内容が「MEnvironment.config」としてシリアル化されます。

次回以降はこの出力された「MEnvironment.config」ファイルが参照されますので、定数に変更があった場合はコンフィグファイルをメンテしてください。

Environmentクラス

''' <summary>
''' 環境
''' </summary>
''' <remarks>環境セット</remarks>
Public Class Environment
    Implements IEnvironment

    ''' <summary>
    ''' 環境名
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks>必須</remarks>
    <XmlAttribute>
    Public Property Name As String Implements IEnvironment.Name

    ''' <summary>
    ''' データベース環境
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks>カスタム環境。必要に応じて追加したり削除したりしてください。</remarks>
    Public Property Database As DatabaseConfig

    ''' <summary>
    ''' Ftp環境
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks>カスタム環境。必要に応じて追加したり削除したりしてください。</remarks>
    Public Property Ftp As FtpConfig

End Class

Nameプロパティ

「debug」、「release」等、環境名を指定してください。

それ以外のプロパティ(Database、Ftp

定数エンティティクラスです。独自で定義してプロパティに設定してください。

Database、Ftpプロパティは単なるサンプルですので、削除しても改変しても問題ありません。

MEnvirionmentクラス

''' <summary>
''' 環境セット
''' </summary>
''' <remarks>
''' 主なDesignerに記述されていますが、通常は編集する必要ありません。
''' ここに記載されているのはConfigファイルがない場合の処理であるため、
''' 通常はConfigファイルを編集して対応してください。
''' </remarks>
Public Class MEnvirionment

    ''' <summary>
    ''' 初期化処理
    ''' </summary>
    ''' <remarks>実体</remarks>
    Private Sub OnInitialize()
        Me.Execution = "debug"

        Me.Environments.Add(MEnvirionment.CreateDebugEnvironment)
        Me.Environments.Add(MEnvirionment.CreateReleaseEnvironment)
    End Sub

    ''' <summary>
    ''' デバッグ環境
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Shared Function CreateDebugEnvironment() As Environment
        Dim c As New Environment With {.Name = "debug"}

        c.Database = New DatabaseConfig With {.Server = "localhost", .User = "anonymous", .Password = String.Empty}
        c.Ftp = New FtpConfig With {.Server = "localhost", .User = "anonymous", .Password = String.Empty}

        Return c
    End Function

    ''' <summary>
    ''' リリース環境
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Shared Function CreateReleaseEnvironment() As Environment
        Dim c As New Environment With {.Name = "release"}

        c.Database = New DatabaseConfig With {.Server = "x.x.x.x", .User = "xxxxx", .Password = "xxxxx"}
        c.Ftp = New FtpConfig With {.Server = "x.x.x.x", .User = "xxxxx", .Password = "xxxxx"}

        Return c
    End Function
End Class

Environmentsプロパティ

環境リストです。1つ以上の環境を追加してください。

Executionプロパティ

実行環境名です。Environmentクラスの環境名で指定してください

ここで指定された環境が、「MEnvirionment.Current」メソッドで取得されます。

OnInitializeメソッド

configファイルが存在しない場合、コールされます。

Environmentsプロパティ、Executionプロパティを初期化してください。

環境の切り替え方

「MEnvironment.config」ファイルの「Execution属性」を変えるだけです。Environmentsプロパティに、debugとreleaseの環境が登録されているとして、例を挙げます。

定数をdebug環境に切り替える

<?xml version="1.0" encoding="utf-8"?>
<MEnvirionment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  Execution="debug">
  <Environments>
  …
  </Environments>
</MEnvirionment>

定数をrelease環境に切り替える

<?xml version="1.0" encoding="utf-8"?>
<MEnvirionment xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  Execution="release">
  <Environments>
  …
  </Environments>
</MEnvirionment>

これだけ。

その他

  • 前身は MConfig - Home ですが、インテリセンスが効かないなどいろいろ使い勝手が悪かったので改良。
  • MEnvironment クラスの大半のコードはPartialクラスで隠れています。基本的に見る必要はありませんが、カスタム化したい場合はこちらMEnvironment.Desinger.vbファイルも参照ください。
. .