这就是解决方案部分的样子。
由于我在 Winforms 环境中使用洋葱架构,因此我有 UI、基础设施和核心层。所有层都使用依赖注入松散耦合。我想要实现的是,每当加载来自帐户表单(类库)的表单时,所有依赖项都应该加载到 UnityContainer 中,即注册的类型。这些依赖项是核心和基础设施项目中存在的接口和实现。
我的困惑是我应该在哪里编写代码来注册依赖项?这个应用程序的组合根是什么?请注意,来自 Accounts Forms、HR Forms 等的表单都是使用 Main Windows 应用程序中的反射加载的,该应用程序仅引用 Base Forms Project。
根据 Eben Roux 的建议
这是加载程序集时我执行wireup代码的方式:
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 方法,所以我封装了我自己的 Resolve 方法。通过这种方式,如果我想更改 IOC 容器而不更改容器引用,我可以很容易地用另一个替换 AccountModule。