はじめに
OpenCoverのコードを読んでいたら、AutofacというDIライブラリが使用されており、気になったのでそれについてです。
チュートリアル
Getting Started — Autofac 4.0 documentation
大体の手順をざっくりと列挙すると
- 脳内でいい感じに制御の反転を組み立てる
Autofacの参照を追加する- アプリケーションの開始時に
ContainerBuilderのインスタンスを生成し- コンポーネントを登録して
- コンテナを生成して
- アプリケーションの実行の間
- ライフタイムスコープを生成して
- ライフタイムスコープを使ってコンポーネントのインスタンスを解決する
といった感じです。
Imports Autofac
Module Module1
Sub Main()
Dim builder = New ContainerBuilder()
builder.RegisterType(Of ConsoleOutput)().As(Of IOutput)()
Dim container = builder.Build()
Using scope = container.BeginLifetimeScope()
Dim out = scope.Resolve(Of IOutput)()
out.WriteLine("hello world")
End Using
End Sub
End Module
Interface IOutput
Sub WriteLine(value As String)
End Interface
Class ConsoleOutput
Implements IOutput, IDisposable
Public Sub WriteLine(value As String) Implements IOutput.WriteLine
Console.WriteLine(value)
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
Console.WriteLine("IDisposable.Dispose")
End Sub
End Class
hello world IDisposable.Dispose
直接コンテナからコンポーネントのインスタンスを生成せずに、ライフタイムスコープからインスタンスを生成することでライフタイムスコープが破棄された時点でライフタイムスコープから生成されたインスタンスも同時に破棄されます。
また、コンポーネントに複数のコンストラクタが存在する場合、コンテナ内に引数となりうる他のコンポーネントが登録されていればそのコンストラクタを使用してインスタンスを生成してくれます。
Module Module1
Sub Main()
With "ジャムおじさんとバタコ"
Dim builder = New ContainerBuilder()
builder.RegisterType(Of AnpanMan)().As(Of IAnpanMan)()
builder.RegisterType(Of Jam)().As(Of IJam)()
builder.RegisterType(Of Batako)().As(Of IBatako)()
Dim container = builder.Build()
Using scope = container.BeginLifetimeScope()
scope.Resolve(Of IAnpanMan)().Anpanchi()
End Using
End With
With "バタコのみ"
Dim builder = New ContainerBuilder()
builder.RegisterType(Of AnpanMan)().As(Of IAnpanMan)()
builder.RegisterType(Of Batako)().As(Of IBatako)()
Dim container = builder.Build()
Using scope = container.BeginLifetimeScope()
scope.Resolve(Of IAnpanMan)().Anpanchi()
End Using
End With
End Sub
End Module
Interface IBatako
End Interface
Class Batako
Implements IBatako
End Class
Interface IJam
End Interface
Class Jam
Implements IJam
End Class
Interface IAnpanMan
Sub Anpanchi()
End Interface
Class AnpanMan
Implements IAnpanMan
Private _anpanchi As String
Public Sub New()
_anpanchi = "顔が濡れて力が出ない"
End Sub
Public Sub New(batako As IBatako, jam As IJam)
_anpanchi = "元気100倍アンパンマン"
End Sub
Public Sub Anpanchi() Implements IAnpanMan.Anpanchi
Console.WriteLine(_anpanchi)
End Sub
End Class
元気100倍アンパンマン 顔が濡れて力が出ない
おわりに
無事に元気100倍アンパンチが出来ました。
余談ですが、ジャムおじさんやバタコさんは人間じゃなかったんですね。
おわり