2014-10-10 2 views
2

저장소에서 나는 응용 프로그램의 수명 내내 살아있는 몇 가지 인스턴스를 유지하지만 때로는 새로운 인스턴스를 container.GetInstance 생성자 오버라이드에 전달하는 경우에도 다른 인스턴스와 LightInject로 해당 인스턴스를 즉시 대체해야합니다. 여기 생성자에 전달 된 새 인스턴스를 사용하여 LightInject에 이미 등록 된 유형을 재정의하는 방법은 무엇입니까?

은 조각은 문제를 보여주고있다 :

internal class ClassA 
    { 
     public string Name { get; private set; } 

     public ClassA(string name) 
     { 
      Name = name; 
     } 

     public override string ToString() 
     { 
      return Name; 
     } 
    } 

    internal class ClassB 
    { 
     public ClassA A { get; private set; } 

     public ClassB(ClassA a) 
     { 
      A = a; 
     } 

     public override string ToString() 
     { 
      return string.Format("I contain {0}", A); 
     } 
    } 

    private void TestContainer() 
    { 
     var container = new LightInject.ServiceContainer(); 
     var a1 = new ClassA("A instance 1"); 
     container.Register(x => a1); 
     container.Register<ClassB>(); 

     var a2 = new ClassA("A instance 2"); 
     var bwitha1 = container.GetInstance<ClassB>(); 
     if(bwitha1.A != a1) 
     { 
      throw new InvalidOperationException("This will not happen"); 
     } 
     var bwitha2 = container.GetInstance<ClassA, ClassB>(a2); 
     if(bwitha2.A != a2) 
     { 
      throw new InvalidOperationException("Something went wrong here"); 
     } 
    } 

왜의 getInstance 호출에 명시 적 인스턴스를 제공하는 경우 LightInject 이전에 등록 된 인스턴스가 우선합니다? 문제를 해결하고 인수 중 하나의 대체 인스턴스로 객체를 생성하는 방법은 무엇입니까?

답변

2

현재 버전의 LightInject에서 런타임 인수를 사용하려면 팩토리를 제공해야합니다.

다음 해결 방법이 유용 할 수 있습니다.

using LightInject; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var container = new ServiceContainer(); 
     container.Register<Bar>(); 
     container.Register<Foo>(); 
     container.Register<Bar, Foo>((factory, bar) => new Foo(bar), "FooWithRuntimeArgument");    
     var instance = container.GetInstance<Foo>();    
     var instanceWithRuntimeArgument = container.GetInstance<Bar, Foo>(new Bar(), "FooWithRuntimeArgument"); 
    } 
} 

public class Foo 
{     
    public Foo(Bar bar) {}   
} 

public class Bar {} 
관련 문제