2016-11-04 10 views
0

LightInjectをしばらく使用していて、それは素晴らしいことでした!しかし、同じタイプの複数のコンストラクタをサポートしようとしているところに突っ込んでください。以下の簡単な例を参照してください。 Fooには4つのコンストラクタがあり、引数のタイプと数によって異なります。コンストラクタごとに1つのマッピングを登録します。 IFooを取得するためにGetInstanceを初めて呼び出すと、次の例外を除いて爆発します。私は何が欠けていますか?この機能をどのように達成できますか?LightInject複数のコンストラクタ

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コンテナが必要ですか?私は、依存性注入が過度に使用されているコードベースを見てきました。あなたは私が注入していることを偽装/偽装する必要があるので、ここで依存性注入を使用していますか?答えがノーならば、おそらく依存関係を注入する必要はありません。多くのコードベースでは、データレイヤーは本当に実際の動作のない単なる束であり、その場合、必要なところでデータレイヤークラスを新しくします。お役に立てれば。 –

関連する問題