Я давно хотел использовать эти приятные среды внедрения зависимостей в моих собственных приложениях, но ни одна из них, похоже, не работает с внедрением конструктора, когда аргумент зависимости передается 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.