2011-11-30 69 views
4
public interface IFoo{} 
public class Foo1 : IFoo { 
    public Foo1(int id){} 
    public Foo1(string val){} 
} 

public class Foo2 : IFoo { 
    public Foo2(int id){} 
    public Foo2(string val){} 
} 

對於那些相應的註冊表設置...StructureMap:如何設置了接口的具體實例混凝土使用特定CTOR

ForRequestedType<IFoo>().TheDefault.Is.ConstructedBy(()=>new Foo1("some string val")); 
InstanceOf<IFoo>().Is.OfConcreteType<Foo2>(); 

,我們使用的IFoo爲別的設置了一個param .. .EX:

public interface IBar{} 
public class Bar1:IBar { 
    public Bar1(IFoo foo){} 
} 

public class Bar2:IBar { 
    public Bar2(IFoo foo){} 
} 

該註冊是如下...

ForRequestedType<IBar>().TheDefault.Is.OfConcreteType<Bar1>().CtorDependency<IFoo>().Is<Foo1>(); 

現在我想BAR2使用foo2的,我想foo​​2的使用構造「新foo2的(1)」我已經嘗試

InstanceOf<Foo2>().Is.ConstructedBy(()=> new Foo2(1)); 

,但失敗了。 如何,如果有的話,我可以使用StructureMap註冊表來工作嗎?

回答

2

你可以在你做這個註冊表:

For<IFoo>().Use(() => new Foo2(1)).Named("BarFoo"); 
For<IFoo>().Use(() => new Foo1("some string val")); 

For<IBar>().Use<Bar1>().Ctor<IFoo>().Named("BarFoo"); 

我測試的結果是這樣的:

// this will be a Foo1 instance constructed with a string ctor parameter 
var foo = container.GetInstance<IFoo>(); 

// this will be a Bar1, containing an instance of Foo2, constructed with the int ctor parameter 
var bar = container.GetInstance<IBar>(); 

配置線的小說明:

  • 線1 - IFoo的註冊綁定到Foo2(int) - 名爲「BarFoo」
  • line 2 - IFoo註冊綁定到Foo1(字符串) - 這將是IFoo的默認值,因爲它是最後定義的
  • 第3行 - 綁定到Bar1的IBar註冊,告訴它使用名爲「BarFoo」的綁定來解決IFoo依賴