Невозможно передать зависимость ByRef с AutoFac или Ninject - PullRequest
0 голосов
/ 02 июля 2019

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

Впервые я обнаружил это, когда Ninject выдавал странное InvalidProgramException при попытке ввести зависимость таким способом.Я удалил ByRef в конструкторе, и исключение ушло.Тогда я подумал, может быть, это просто проблема с Ninject.Итак, я переключился на AutoFac и столкнулся с той же проблемой, но с более наглядным исключением.Я понимаю, что явная передача ByRef действительно имеет смысл только при передаче типов значений, но мне пришлось бы изменить множество классов, чтобы удалить ключевое слово ByRef.Есть ли способ сделать это?Спасибо.

Imports Autofac
Imports Ninject
Module Module1

    Class Foo
    End Class

    Class Bar
        Private _foo As Foo
        Sub New(ByRef foo As Foo)
            _foo = foo
        End Sub
    End Class

    Enum Test
        Ninject
        AutoFac
    End Enum

    Sub Main()
        For i = Test.Ninject To Test.AutoFac
            Try
                Select Case i
                    Case Test.Ninject
                        Dim kernel = New StandardKernel
                        kernel.Bind(Of Foo).ToSelf()
                        kernel.Bind(Of Bar).ToSelf()
                        kernel.Get(Of Bar)
                    Case Test.AutoFac
                        Dim builder = New ContainerBuilder
                        builder.RegisterType(Of Foo).AsSelf
                        builder.RegisterType(Of Bar).AsSelf
                        Dim container = builder.Build
                        container.Resolve(Of Bar)
                End Select
            Catch ex As Exception
                 Console.WriteLine($"{[Enum].GetName(GetType(Test), i)} Test - {ex.GetType.ToString}: {ex.Message}")
            End Try
        Next
        Console.ReadLine()
    End Sub

End Module

Вывод ...

Ninject Test - System.InvalidProgramException: Common Language Runtime detected an invalid program.
AutoFac Test - Autofac.Core.DependencyResolutionException: An exception was thrown while activating NijectDemo.Module1+Bar.
...