2016-11-04 8 views
0

LightInject를 잠시 사용 해왔다. 같은 유형의 여러 생성자를 지원하려고하는 걸림돌을 치십시오. 아래의 단순화 된 예를 참조하십시오. Foo는 인수의 유형 및 수에 따라 4 개의 생성자를가집니다. 생성자마다 하나의 매핑을 등록합니다. IFoo를 검색하기 위해 GetInstance를 처음 호출하면 다음 예외가 발생하여 불어납니다. 내가 뭘 놓치고 있니? 이 기능을 어떻게 수행 할 수 있습니까?LightInject multiple constructors

InvalidCastException : 'LightInject.ServiceContainer'형식의 개체를 'System.Object []'형식으로 캐스팅 할 수 없습니다.

Public Interface IFoo 

End Interface 

Public Class Foo 
    Implements IFoo 

    Public Sub New() 

    End Sub 

    Public Sub New(name As String) 

    End Sub 

    Public Sub New(age As Integer) 

    End Sub 

    Public Sub New(name As String, age As Integer) 

    End Sub 

End Class 


container.Register(Of IFoo, Foo) 
container.Register(Of String, IFoo)(Function(factory, name) New Foo(name)) 
container.Register(Of Integer, IFoo)(Function(factory, age) New Foo(age)) 
container.Register(Of String, Integer, IFoo)(Function(factory, name, age) New Foo(name, age)) 

Dim f1 As IFoo = container.GetInstance(Of IFoo)()      'BOOM! 
Dim f2 As IFoo = container.GetInstance(Of String, IFoo)("Scott") 
Dim f3 As IFoo = container.GetInstance(Of Integer, IFoo)(25) 
Dim f4 As IFoo = container.GetInstance(Of String, Integer, IFoo)("Scott", 25) 
+0

당신의'Foo' 클래스는 DI 컨테이너에 의해 해결되어야하는 구성 요소처럼 보이지 않습니다; 대신 엔티티 또는 DTO처럼 보입니다. 그것들과 같은 객체는 DI 컨테이너에 의해 해석되어서는 안됩니다. 왜냐하면 그것은 모호함을 야기 할 뿐이 기 때문입니다. – Steven

답변

0

당신은 완전히 이러한 목표를 달성하기 위해 공장을 형식화 할 수 있습니다. 당신이 가치를 추가 느끼는 경우

http://www.lightinject.net/#typed-factories

Imports LightInject 

Namespace Sample 
    Class Program 
     Private Shared Sub Main(args As String()) 
      Console.WriteLine("Go") 

      Dim container = New ServiceContainer() 
      container.Register(Of FooFactory)() 

      Dim fooFactory = container.GetInstance(Of FooFactory)() 
      Dim f1 As IFoo = fooFactory.Create() 
      Dim f2 As IFoo = fooFactory.Create("Scott") 
      Dim f3 As IFoo = fooFactory.Create(25) 
      Dim f4 As IFoo = fooFactory.Create("Scott", 25) 

      Console.WriteLine("Stop") 
      Console.ReadLine() 
     End Sub 
    End Class 

    Public Interface IFoo 

    End Interface 

    Public Class Foo 
     Implements IFoo 


     Public Sub New() 
     End Sub 


     Public Sub New(name As String) 
     End Sub 


     Public Sub New(age As Integer) 
     End Sub 


     Public Sub New(name As String, age As Integer) 
     End Sub 

    End Class 

    Public Class FooFactory 

     Public Function Create() As IFoo 
      Return New Foo() 
     End Function 

     Public Function Create(name As String) As IFoo 
      Return New Foo(name) 
     End Function 

     Public Function Create(age As Integer) As IFoo 
      Return New Foo(age) 
     End Function 

     Public Function Create(name As String, age As Integer) As IFoo 
      Return New Foo(name, age) 
     End Function 
    End Class 
End Namespace 

참고

, 당신은 IFooFactory 인터페이스를 만들 수 있습니다.

+0

빠른 답변 주셔서 감사합니다! 이를 수행하기 위해 공장을 사용해야하는 필요성은 불필요한 추상화처럼 보입니다. 모든 인터페이스가 고유 한 인터페이스를 구현하는 100 개가 넘는 엔티티가있는 데이터 액세스 레이어가 있습니다. 팩토리 레이어가 필요하기 때문에 수백 개의 팩토리와 해당 인터페이스 정의가 필요합니다. 이 방법으로 설계된 기술적 인 이유가 있습니까? –

+0

각 데이터 계층 클래스에 대해 여러 생성자가 실제로 필요합니까? 클래스가 필요한 생성자에 따라 클래스의 동작이 변경되거나 편의상 필요합니까? 나중에, 공장이 필요하지 않으므로 IOC 컨테이너를 사용하는 가장 깨끗한 경로를 제공하므로 기본 생성자만을 사용합니다. –

+0

데이터 레이어 클래스를 새로 만들기 위해 IOC 컨테이너가 필요한 이유는 무엇입니까? 의존성 주입이 과도하게 사용 된 코드 기반을 보았습니다. 당신은 스스로에게 물어봐야합니다. 왜냐하면 제가 주입하는 것을 조롱하거나 가짜로 만들 필요가 있기 때문에 여기에 의존성 주입을 사용하고 있습니까? 대답이 '아니오'인 경우 종속성을 주입 할 필요가 없습니다. 많은 코드베이스에서 데이터 영역은 실제로 실제 동작이없는 여러 개의 구조로 구성되어 있으며,이 경우 필요한 데이터 계층 클래스를 새로 추가합니다. 희망이 도움이됩니다. –