VBAでのDIコンテナ実装ガイド

こんにちは!大阪市住之江区に拠点を置く会社『縁紡ぐ』の稲垣です。

当社は、Excel、ACCESS、RPAなどのシステム開発や既存ツールを使った業務効率化の提案、また、ITスキルアップのための教育に力を入れています。効率的なビジネス運営を目指している企業様、ITスキルの向上を図りたい企業や個人の方に、最適なご提案をさせていただきます。業務プロセスの改善とITスキルアップをサポートし、共に成長するパートナーでありたいと考えています。

VBAでのDIコンテナ実装ガイド

目次

DIコンテナとは

DI(Dependency Injection)コンテナは、オブジェクトの依存関係を管理するためのツールです。オブジェクト指向型の言語であるJavaの開発では、DIコンテナは便利で使われています。VBAにおいては、DIコンテナと同様の機能はありませんが、似た機能を作成したいと思います。シングルトンになりますが。
クラスでの開発は、コードの再利用性やテストの容易さを向上させるため少し大きめのシステムを作成する場合は、クラスを使うことをおススメします。実装方法も解説します。

コードの解説

今回は、DIコンテナは標準モジュールで実装します。モジュール名は、『DIContainar』(プログラム開始時に毎回、インスタンス化するコードを記載するのが面倒なため💦)

 DIコンテナの初期化

VBAの場合、辞書型を利用すると、『キー』と『オブジェクト』を関連付けて保存することができます。

Private Sub InitializeContainer()
    If registry Is Nothing Then
        Set registry = CreateObject("Scripting.Dictionary")
    End If
End Sub

辞書を作成して、DIコンテナ役の辞書を初期化します。

クラス名と生成するオブジェクトの紐づけ

VBAでは、「New 変数」 で、インスタンス化する方法が調査しても不明でした。そのため、クラス名とインスタンス化するものを紐づけするために、Selectで実装しました。

Private Function CreateInstance(classType As String) As Object
    Select Case classType
        Case "studentManager"
            Set CreateInstance = New studentManager
        ' 他のクラスがあればここに追加
        Case "classManager"
            Set CreateInstance = New classManager
        Case Else
            Err.Raise vbObjectError + 1001, "DIContainer", "未知のクラス: " & classType
    End Select
End Function

クラスが増えた場合は、追加することで対応ができます

インスタンスを取得するメソッド

' 存在しなければ新規作成して登録
Public Function RegisterOrResolve(className As String, classType As String) As Object
    InitializeContainer
    If registry.Exists(className) Then
        ' 既に存在する場合はインスタンスを返す
        Set RegisterOrResolve = registry(className)
    Else
        ' 存在しない場合は新規に作成し、登録
        Dim newInstance As Object
        Set newInstance = CreateInstance(classType)
        registry.Add className, newInstance
        Set RegisterOrResolve = newInstance
    End If
End Function

このRegisterOrResolveを呼び出すときに、クラス名とクラスタイプ名を渡すと、最初に作成した辞書に、登録がされている場合は、辞書に登録されているインスタンスを返却します。

辞書に登録がない場合は、先ほど作成した、CreateInstanceメソッドを呼び出しインスタンス化して辞書に登録をします。

DIコンテナからインスタンスを取得する

Set studentMg = DIContainar.RegisterOrResolve("studentManager", "studentManager")

これで、DIコンテナからインスタンスを取得することができます。

まとめ

VBAでDIコンテナを実装する方法をご紹介しました。クラスで開発することで、保守性が向上します。業務効率化を目指す方には特におすすめです。ぜひ、実際にコードを試してみてください。

記事を書いた人

稲垣

  • Excel、ACCESSでのシステム開発が得意
  • ITスキルを共有し実践的に学びながら成長する人を見るのが幸せ
  • 自家焙煎するほどのコーヒー好き
  • 使用言語 VBA、Python、Javascript、Java、HTML、CSS etc.
  • 保有資格 Kintoneアソシエイト、日商簿記検定2級、マンション管理士、管理業務主任者、情報セキュリティマネジメント、ExcelVBA etc.
  • 業務フロー図の作成や業務時間分析を通して、効率化ポイントを探る人
  • お客様にとって本当に良いことかを第一に考える人
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次