これは、ソリューションが部分的にどのように見えるかです。
私は Winforms 環境で Onion Architecture を使用しているため、UI、インフラストラクチャ、およびコア層があります。すべてのレイヤーは、依存性注入を使用して疎結合されています。私が達成したいのは、Accounts Forms (クラス ライブラリ) などのフォームがロードされるたびに、そのすべての依存関係を UnityContainer にロードする必要があることです。つまり、タイプを登録します。これらの依存関係は、コア プロジェクトとインフラストラクチャ プロジェクトに存在するインターフェイスと実装です。
私の混乱は、依存関係を登録するコードをどこに書くべきかということです? このアプリケーションの構成ルートは何ですか? Accounts Forms、HR Forms などのフォームはすべて、Base Forms Project のみを参照するメイン Windows アプリケーションのリフレクションを使用して読み込まれることに注意してください。
Eben Roux の提案の後
アセンブリがロードされたときにワイヤアップ コードを実行する方法は次のとおりです。
Dim assemb As System.Reflection.Assembly
...
...
If assemb IsNot Nothing Then
Dim type As Type = GetType(IDependencyWiring)
Dim modules As List(Of Type) = assemb.GetTypes().Where(Function(p) type.IsAssignableFrom(p) AndAlso p.IsClass).ToList()
For Each [module] As Type In modules
Dim argTypes As Type() = New Type() {}
Dim cInfo As ConstructorInfo = [module].GetConstructor(argTypes)
Dim dependencyWiringModule As IDependencyWiring = DirectCast(cInfo.Invoke(Nothing), IDependencyWiring)
dependencyWiringModule.WireUp()
Next
End If
これは、WireUp メソッドを持つモジュールです。
Public Class AccountModule : Implements IDependencyWiring
Private Shared Container As IUnityContainer
Public Sub New()
Container = New UnityContainer()
End Sub
Public Sub WireUp() Implements IDependencyWiring.WireUp
Container.RegisterType(Of IInterface1, Class1)()
Container.RegisterType(Of IInterface2, Class2)()
Container.RegisterType(Of IInterface3, Class3)()
Container.RegisterType(Of IInterface4, Class4)()
End Sub
Public Shared Function Resolve(typeToResolve As Type) As Object
Return Container.Resolve(typeToResolve.GetType())()
End Function
End Class
だから私の質問は今です:
- Container を Shared として保存し、それを使用して Resolve メソッドを介して依存関係を解決するのは正しいアプローチですか?
- コンテナの解決動作をカプセル化する方法に問題があります。そのための正しい構文は何でしょうか? Resolve メソッドを呼び出せるようにするために各フォームで Unity を参照したくないので、独自の Resolve メソッドをカプセル化しています。このようにして、どこでもコンテナー参照を変更せずに IOC コンテナーを変更したい場合、AccountModule を別のものに簡単に置き換えることができます。