WinForms中用户控件的属性注入
我继承了一个VB.NET WinForms应用程序。它写得很糟糕,有很多不好的做法。第一个任务是使用容器将一些DI引入应用程序,以解决依赖关系,这样我就可以开始分解这个东西并对其进行测试 这是我的第一个WinForms应用程序,我正在学习基于单个线程的非请求应用程序的细微差别 我使用Simple Injector作为IoC容器 我需要重构的一个用例是扩展DevExpressWinForms中用户控件的属性注入,winforms,simple-injector,devexpress-windows-ui,Winforms,Simple Injector,Devexpress Windows Ui,我继承了一个VB.NET WinForms应用程序。它写得很糟糕,有很多不好的做法。第一个任务是使用容器将一些DI引入应用程序,以解决依赖关系,这样我就可以开始分解这个东西并对其进行测试 这是我的第一个WinForms应用程序,我正在学习基于单个线程的非请求应用程序的细微差别 我使用Simple Injector作为IoC容器 我需要重构的一个用例是扩展DevExpressXtraUserControl的UserControl 从简单的喷油器文档: 注意:在用户控件中不可能使用构造函数注入。用户
XtraUserControl
的UserControl
从简单的喷油器文档:
注意:在用户控件中不可能使用构造函数注入。用户控件必须具有默认构造函数。相反,使用方法注入将依赖项传递给用户控件
关于如何设置属性注入,我将一字不差地遵循文档:
以下是我的配置:
Private Shared Sub Bootstrap()
Container = New Container()
Container.Options.DefaultScopedLifestyle = New ThreadScopedLifestyle()
Container.Options.PropertySelectionBehavior = New ImportPropertySelectionBehavior()
Container.Register(Of ICommissionManager, CommissionManager)(Lifestyle.Singleton)
Container.Register(Of frmMain, frmMain)(Lifestyle.Singleton)
Container.Register(Of viewSalesCustomers, viewSalesCustomers)(Lifestyle.Transient)
'https://stackoverflow.com/questions/38417654/winforms-how-to-register-forms-with-ioc-container/38421425
Dim registration As Registration = Container.GetRegistration(GetType(viewSalesCustomers)).Registration
registration.SuppressDiagnosticWarning(DiagnosticType.DisposableTransientComponent, "a reason")
Container.Verify()
End Sub
用户控件:
Public Class viewSalesCustomers
Inherits DevExpress.XtraEditors.XtraUserControl
<Import>
Public Property CommissionManager As ICommissionManager
...redacted...
Private Sub viewSalesCustomers_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim commissions As ICollection(Of Commission)
commissions = CommissionManager.Get(Function(commission) commission.CommissionId = 1) <-- Always nothing (null)
End Sub
请显示显示如何从
容器中解析viewSalesCustomers
的代码。只有当您让Simple Injector创建这样的用户控件(或初始化现有控件)时,属性注入才有效,例如使用Container.GetInstance(viewSalesCustomers的)
@Steven-谢谢!这就成功了。在您的情况下,似乎最终还是可以使用构造函数注入。请显示代码,说明如何从容器中解析viewSalesCustomers
。只有当您让Simple Injector创建这样的用户控件(或初始化现有控件)时,属性注入才有效,例如使用Container.GetInstance(viewSalesCustomers的)
@Steven-谢谢!这就成功了。看起来,在您的例子中,您可能最终能够使用构造函数注入。
Private Sub BarSubItem2_ItemClick(ByVal sender As Object, ByVal e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarSubItem2.ItemClick
Cursor = Cursors.WaitCursor
'Dim mView as New viewSalesCustomers()
Dim mView As viewSalesCustomers
mView = Program.Container.GetInstance(Of viewSalesCustomers)
showViewer(mView, "viewSalesCustomers")
Cursor = Cursors.Default
End Sub