Я унаследовал приложение 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