使用Unity Container创建运行时对象

时间:2016-06-30 10:33:12

标签: .net vb.net inversion-of-control unity-container ioc-container

我有一个现有的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;

除了客户之外,我无法访问演示者需要的任何对象,例如视图。

1 个答案:

答案 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。

我慢慢开始看到我的一些错误/学习如何进行依赖注入。我不知道这是否是正确的解决方案但是根据我目前的理解,这对原始代码来说是一个更好的解决方案。