Внедрение свойств для пользовательских элементов управления в WinForms - PullRequest
1 голос
/ 21 марта 2019

Я унаследовал приложение VB.NET WinForms.Это очень плохо написано с большим количеством плохих практик.Первым делом стоит добавить в приложение некоторый DI с контейнером для разрешения зависимостей, чтобы я мог начать разбивать эту штуку и тестировать ее.

Это мое первое приложение WinForms, и я учусьнюансы приложения, не основанного на запросах, в одном потоке.

Я использую Simple Injector в качестве контейнера IoC.

Один из моих вариантов использования, который мне нужен для рефакторинга, - это UserControl, расширяющий DevExpress XtraUserControl.

Из документов Simple Injector:

Примечание: Невозможно использовать конструктор Injection в пользовательских элементах управления.Пользовательские элементы управления должны иметь конструктор по умолчанию.Вместо этого передайте зависимости своим пользовательским элементам управления, используя метод Injection.

Я дословно следую документации о том, как настроить внедрение свойства:

IPropertySelectionBehavior

Вот моя конфигурация:

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

Я знаю, что контейнер разрешает все, что происходит от Form (я проверял это с помощью инжектора конструктора).

Не уверен, что я упустил здесь при введении свойства для этого элемента управления.

ОБНОВЛЕНИЕ:

@ Стивен был на месте.Я нашел, где они инстанцируют управление.

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
...