自作した.NET C#用のDIコンテナの使い方説明

先日、GitHubに自作のC#用DIコンテナをMITライセンスで公開しました。

.NET Framework 4.5と.NET Standard 2.0の両対応です。

注意
こちらのDIコンテナではコンストラクタにインジェクトするタイプだけをサポートしています。

導入

簡単に導入できるようにNugetパッケージで公開しています。

Demo用クラスの紹介

DIコンテナに登録していくクラス達です。

1. なにもないクラス

2. なにもないクラスを注入されるクラス(インターフェースなし)

3. intとstringをコンストラクタから注入できるクラス

4. 1と3のクラスをコンストラクタから注入できるクラス

5. 1と3と4のクラスとintをコンストラクタから注入できるクラス

Demo1: 基本の登録と調達

はじめに最もシンプルな使い方を説明します。これからDemo用クラス2のHaveNoMeanConstructorクラスのインスタンスを調達しようと思います。その時HaveNoMeanConstructorクラスのコンストラクタに指定しているINoMeanInterfaceインターフェースにはNoMeanClassクラスのインスタンスをDIコンテナに作ってもらいたいとします。

まず、このDIコンテナの窓口はDiVendorクラスのインスタンスです。そしてこのDIコンテナでは調達したいクラスは全て登録する必要があります。今回で言うと内部で要求されるINoMeanInterfaceインターフェースを継承するNoMeanClassクラスと、HaveNoMeanConstructorクラスをRegisterメソッドで登録しておきます。この登録順は前後しても構いません。

このように書いて実行すると、haveNoMeanConstructorには、中にNoMeanClassクラスのインスタンスを持ったHaveNoMeanConstructorクラスのインスタンスが代入されます。

MEMO
調達されるインスタンスは、何も設定しなければデフォルトでシングルトンかつ遅延作成されます。Registerメソッドの引数から変更することが可能です。

また、DiVendorDisposeすると、それまでに調達してもらうために作られた全てのインスタンスを破棄するよう試みます。この関数で破棄してもらうには、登録するクラスがIDisposableインターフェースを継承している必要があります。

Demo2: 複雑なクラス構成の対応

より複雑な状況にもある程度対応することができます。コンストラクタに注入する値は、デフォルトの自動解決の他に手動で決めておくことができます。それを実現するにはDiBlueprintクラスのインスタンスを作成する必要があります。これはDiArchitectクラスのインスタンスからCreateBlueprint<T>メソッドを使って作成することができます。

DiBlueprintクラスにあるAppendArgumentInfo<T>メソッドをチェインしていくことで、引数の設定を付属させることができます。ここではコンストラクタにintstringを持つLiteralConstructorクラスに、インスタンス生成時に任意の値を代入するよう設定しています。ここで生成されたDiBlueprintクラスのインスタンスをRegisterメソッドの引数に与えることで、調達時にその内容の通りに動作させることができます。

Demo3: nullを与えた場合の対応

DiBlueprintクラスのAppendArgumentInfo<T>メソッドの引数にnullを与えた場合、DIコンテナが内部でインスタンスを調達する設定となります。実際にnullを代入したい場合は、第二引数をtrueとすることで、DIコンテナに調達させずにnullを代入させることができます。

コメントを残す