2016-07-22 67 views
0

每LightInject的文檔,我們可以創建一個類型化的工廠,並通過這樣的一個值,以它:LightInject類型的工廠,參數

public class Foo : IFoo 
{ 
    public Foo(int value) 
    { 
     Value = value; 
    } 

    public int Value { get; private set; } 
} 

public interface IFooFactory 
{ 
    IFoo GetFoo(int value); 
} 

public class FooFactory : IFooFactory 
{ 
    private Func<int, IFoo> createFoo; 

    public FooFactory(Func<int, IFoo> createFoo) 
    { 
     this.createFoo = createFoo; 
    } 

    public IFoo GetFoo(int value) 
    { 
     return createFoo(value); 
    } 
} 

而且我們註冊這樣說:

container.Register<int, IFoo>((factory, value) => new Foo(value)); 
container.Register<IFooFactory, FooFactory>(new PerContainerLifetime()); 

我們可以這樣調用GetFoo:

var typedFooFactory = container.GetInstance<IFooFactory>(); 
var foo = typedFooFactory.GetFoo(42); 

所以現在我的問題是:我們明確地實例化foo註冊工廠新的Foo(值)。但是,如果我們想在基於值的GetFoo方法內執行該操作呢?

public IFoo GetFoo(int value) 
{ 
    switch (value) 
    { 
     case 1: return new Foo(1); 
     case 2: return new FooThatImplementsIFoo(2); 
     case 3: return new AnotherFooThatImplementsIFoo(3); 
     default: return null; 
    } 
} 

我希望能夠調用GetFoo並基於「value」獲得正確的實現。

var typedFooFactory = container.GetInstance<IFooFactory>(); 
var foo = typedFooFactory.GetFoo(3); 
Assert.AreEqual(foo.GetType(),typeof(AnotherFooThatImplementsIFoo)); 

回答

0

關鍵是要記住,在我們工廠的GetFoo方法中,我們沒有調用委託,而只是傳遞給它的引用。調用是當我們註冊工廠時(通過實例化一個Foo對象)。 所以我所做的就是創建一個基於「價值」產生的IFoo的實現靜態工廠類:

container.Register<int, IFoo>((factory, value) => FooFactory.GetInstance); 

而且我FooFactory看起來是這樣的:

public static class FooFactory 
{ 
    public static IFoo GetInstance(IServiceFactory serviceFactory, int value) 
    { 
     switch (value) 
     { 
      case 1: 
      { 
       return serviceFactory.GetInstance<Foo>(); 
      } 
      case 2: 
      { 
       return serviceFactory.GetInstance<FooThatImplementsIFoo>(); 
      } 
      case 3: 
      { 
       return serviceFactory.GetInstance<AnotherFooThatImplementsIFoo>(); 
      } 
      default: 
      { 
       return null; 
      } 
     } 
    } 
} 

所以我通過調用委託這樣做:

var typedFooFactory = container.GetInstance<IFooFactory>(); 
var foo = typedFooFactory.GetFoo(3); 

現在我的Foo對象的類型是AnotherFooThatImplementsIFoo的

Assert.AreEqual(foo.GetType(),typeof(AnotherFooThatImplementsIFoo));