2016-11-04 2 views
0

Seit einiger Zeit verwenden Sie LightInject und es war großartig! Versuchen Sie einen Fehler zu beheben, indem Sie versuchen, mehrere Konstruktoren desselben Typs zu unterstützen. Siehe das vereinfachte Beispiel unten. Foo hat vier Konstruktoren, die sich durch Art und Anzahl der Argumente unterscheiden. Ich registriere ein Mapping pro Konstruktor. Beim ersten Aufruf von GetInstance, um ein IFoo abzurufen, wird die folgende Ausnahme ausgelöst. Was vermisse ich? Wie kann ich diese Funktionalität erreichen?LightInject multiple Konstruktoren

InvalidCastException: Darf das Objekt des Typs 'LightInject.ServiceContainer' nicht in den Typ 'System.Object []' umgewandelt werden.

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

Ihre 'Foo'-Klasse scheint nicht wie eine Komponente zu sein, die von Ihrem DI-Container gelöst werden sollte; es scheint stattdessen eine Entität oder ein DTO zu sein. Objekte wie diese sollten von Ihrem DI-Container nicht aufgelöst werden, da dies nur zu Mehrdeutigkeiten führen würde. – Steven

Antwort

0

können Sie Fabriken verwenden getippt diese sauber zu erreichen.

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 

Hinweis, können Sie eine IFooFactory Schnittstelle erstellen, wenn Sie es einen Mehrwert zu fühlen.

+0

Danke für die schnelle Antwort! Die Notwendigkeit, eine Fabrik dazu zu benutzen, scheint eine unnötige Abstraktionsebene zu sein. Ich habe eine Datenzugriffsebene mit über einhundert Entitäten, die alle eine eindeutige Schnittstelle implementieren. Die Notwendigkeit einer Factory-Schicht führt dazu, dass Hunderte von Fabriken und entsprechende Schnittstellendefinitionen benötigt werden. Weißt du, gibt es einen technischen Grund, warum es so konzipiert ist? –

+0

Benötigen Sie wirklich mehrere Konstruktoren für jede Ihrer Datenschichtklassen? Sind sie notwendig (vielleicht weil sich das Verhalten der Klasse ändert, abhängig davon, welchen Konstruktor Sie verwenden) oder nur aus Bequemlichkeit? Wenn es das spätere ist, würde ich nur mit den Standardkonstruktoren bleiben, da es den saubersten Pfad zur Verwendung von IOC-Containern bietet, da keine Factory erforderlich wäre. –

+0

Ich muss jedoch fragen, warum brauchen Sie einen IOC-Container, um Ihre Datenschichtklassen neu zu erstellen? Ich habe Codebasen gesehen, in denen die Abhängigkeitsinjektion überstrapaziert wurde. Sie sollten sich fragen, verwende ich hier die Abhängigkeitsinjektion, weil ich das Ding, das ich injiziere, falsch machen muss? Wenn die Antwort nein ist, müssen Sie die Abhängigkeit möglicherweise nicht injizieren. In vielen Codebasen ist die Datenschicht eigentlich nur eine Ansammlung von Strukturen ohne echtes Verhalten, und in diesem Fall führe ich einfach die Datenschichtklassen neu, wo ich sie brauche. Hoffe das hilft. –