我有一个现有的winforms应用程序我正在尝试重新编写现在使用Unity作为容器而不是手动必须在整个地方创建对象。目前情况并不太糟糕,但我们将扩展计划,没有Unity,我可以看到事情变得复杂。我很难理解如何创建一些依赖于运行时信息的对象。 以下代码作为当前工作原理的示例(该程序允许您一次查看多个客户,每个客户都在新选项卡上)...... ..
Public Class CustomerSearchPresenter
Implements ICustomerSearchPresenter
Private Repo As ICustomerRepo
Private View As ICustomerSearchView
Private Builder As Func(Of ICustomerPresenter)
Public Sub New(_view As ICustomerSearchView, _customerRepo As ICustomerRepo, _customerBuilder As Func(Of ICustomerPresenter))
View = _view
Repo = _customerRepo
End Sub
Public Sub SearchForCustomer(_customerNumber As String) Implements ICustomerSearchPresenter.SearchForCustomer
'seach the database to see if customer exists and if so create a new customer view...
Dim foundCustomer As ICustomer = Repo.find(_customerNumber)
If Not IsNothing(foundCustomer) Then
'* Assumed I could call invoke and then register the customer afterwards, but this just invokes the same object
Dim custPresenter As ICustomerPresenter = Builder.Invoke
custPresenter.registerCustomer(_foundCustomer)
Else
View.feedback("No customer found for " & _customerNumber)
End If
End Sub
End Class
每次用户搜索有效的客户编号时,CustomerSearchPresenter都负责创建新的客户部分。这很简单,因为存储库返回了客户对象,我们可以在创建相关视图/演示者时手动注入它(尽管这是基于MVP我猜测相同的理论适用于MVC等)。
我第一次尝试使用Unity重做这个(使用Func(of))但它不起作用 - 调用调用不会创建一个新对象并返回相同的对象。每次用户搜索一个时,我应该如何创建一个新的客户特定演示者?
Public Class CustomerPresenterFactory
Implements ICustomerPresenterFactory
Function Create(_customer As ICustomer) As ICustomerPresenter Implements ICustomerPresenterFactory.Create
Return ????
End Function
End Class
编辑:func(of)方法确实有效,我用ContainerControlledLifetimeManager注册了这个类型,这意味着它总是返回相同的Presenter。那么现在这是解决它的最好/最正确的方法吗?
编辑2:感谢指出我的其他问题,但我很难将它们应用到我的代码中。我仍然需要从容器中解析我的对象(不传递容器),这意味着以下示例如何帮助我解决...
alter table <table_name> convert to character set utf8 collate utf8_unicode_ci;
除了客户之外,我无法访问演示者需要的任何对象,例如视图。
答案 0 :(得分:0)
我已经使用了以下解决方案,我认为这样可以解决问题。我现在可以创建一个客户演示者,并知道它将被赋予客户对象以供使用。
Public Class CustomerPresenterFactory
Implements ICustomerPresenterFactory
Private creator As Func(Of ICustomerPresenter)
Public Sub New(_creator As Func(Of ICustomerPresenter))
creator = _creator
End Sub
Function Create(_customer As ICustomer) As ICustomerPresenter Implements ICustomerPresenterFactory.Create
Dim obj As ICustomerPresenter = creator.Invoke
obj.Customer = _customer
Return obj
End Function
End Class
原始帖子中的searchPresenter现在将其作为依赖项,并可在每个成功的搜索结果后创建一个新的CustomerPresenter。
我慢慢开始看到我的一些错误/学习如何进行依赖注入。我不知道这是否是正确的解决方案但是根据我目前的理解,这对原始代码来说是一个更好的解决方案。