WinForms中用户控件的属性注入

WinForms中用户控件的属性注入,winforms,simple-injector,devexpress-windows-ui,Winforms,Simple Injector,Devexpress Windows Ui,我继承了一个VB.NET WinForms应用程序。它写得很糟糕,有很多不好的做法。第一个任务是使用容器将一些DI引入应用程序,以解决依赖关系,这样我就可以开始分解这个东西并对其进行测试 这是我的第一个WinForms应用程序,我正在学习基于单个线程的非请求应用程序的细微差别 我使用Simple Injector作为IoC容器 我需要重构的一个用例是扩展DevExpressXtraUserControl的UserControl 从简单的喷油器文档: 注意:在用户控件中不可能使用构造函数注入。用户

我继承了一个VB.NET WinForms应用程序。它写得很糟糕,有很多不好的做法。第一个任务是使用容器将一些DI引入应用程序,以解决依赖关系,这样我就可以开始分解这个东西并对其进行测试

这是我的第一个WinForms应用程序,我正在学习基于单个线程的非请求应用程序的细微差别

我使用Simple Injector作为IoC容器

我需要重构的一个用例是扩展DevExpress
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