2011-06-27 39 views
2

子和父類之間的相同的依賴我有這個樣子如何解決與structuremap

public class ParentClass 
{ 
    public ParentClass(IChildClass childClass, IDependency dependency) 
    { } 
} 

public ChildClass : IChildClass 
{ 
    public ParentClass(IDependency dependency) 
    { } 
} 

幾個班是否有通過StructureMap登記父類的方法,使其與IDependency解決了ParentClassIChildClass之間的實例是相同的嗎?

編輯

爲了澄清,我正在尋找解決ParentClass,如果它已經手動創建像這樣(從MrFox的答案):

IDependency dependency = new Dependency(); 
ChildClass childClass = new ChildClass(dependency); 
ParentClass parentClass = new ParentClass(childClass, dependency); 

IDependency應該是單身。我想每次都用不同的IDependency來解決ParentClass

回答

3

此處的代碼將爲您提供父級和子級的相同IDependency。

var container = new Container(x => { 
      x.For<IChildClass>().Use<ChildClass>(); 
      x.For<IDependency>().Use<Dependency>(); 
     }); 

var firstParent = container.GetInstance<ParentClass>(); 

如果你在哪裏可以找到另一個container.GetInstance<ParentClass>();它會給你一個新的父母,子女和依賴。如果您希望將IDependency作爲單數形式,所以每次您要求父級或子級時都會使用它,那麼您可以使用Singeleton方法進行註冊:x.For<IDependency>().Singleton().Use<Dependency>();

+0

我期望能夠創建一個'ChildClass'的'ParentClass',它們都共享_same_'IDependency'。你就是這樣創建一個'ParentClass',其中一個'IDependency'和'ChildClass'實例與'IDependency'的另一個實例。我不想'IDependency'成爲一個單身人士。當創建單獨的'ParentClass'實例時,它們應該具有不同的'IDependency'。我會更新我的問題來澄清。 – JChristian

+0

我在這裏提供的示例將具有相同的IDependency,用於ParentClass和傳遞給ParentClass構造函數的ChildClass。結構圖使用PerRequest生命週期,而不是大多數IoC使用的瞬態生命週期。 – Bassetassen

+0

哇,你說得對。這正是我想要做的。 – JChristian

1

傳遞一個IDependency對象的引用到兩個構造:

IDependency dependency = new Dependency(); 
ChildClass childClass = new ChildClass(dependency); 
ParentClass parentClass = new ParentClass(childClass, dependency); 
+0

我正在尋找如何設置StructureMap來解決像這樣的父類。所以對'ObjectFactory.GetInstance ()'的調用將會像手動那樣返回一個'ParentClass'。 – JChristian

2

我不能回答StructureMap是否能做到這一點。但是使用工廠從父項中創建子項會爲您提供一個IoC容器不可知的解決方案。

public interface IChildFactory { 
    IChild Create(IDependency dependency); 
} 

public class ParentClass 
{ 
    private readonly IChildClass _child; 

    public ParentClass(IChildFactory childFactory, IDependency dependency) 
    { 
    _child = childFactory.Create(dependency); 
    } 
} 

class ChildFactory : IChildFactory 
{ 
    IChildClass Create(IDependency dependency) 
    { 
    return new ChildClass(dependency); 
    } 
} 

現在所有IChild情況下,將通過這個簡單的工廠,而不是通過IoC容器來創建。