2011-01-31 43 views
3

我想找出兩個其他兩個類之間共享類的實例的最佳方式。在溫莎城堡的其他類之間共享類的實例

說我有這些類:

class A 
{ 
    public A(B b, C c) {} 
} 

class B 
{ 
    public B(IDFactory factory) {} 
} 

class C 
{ 
    public C(IDFactory factory) {} 
} 

interface IDFactory 
{ 
    D GetD(); 
} 

class D {} 

併爲A每個實例,我想cd曾經是D單一實例的D。當我創建的A一個新實例(使用說一廠),我想cd分享D.

實例

到目前爲止,我已經想通,使用使用上下文定製的生活方式(使用this酷庫)可能是最好的方法。所以我會做這樣的事情:

WindsorContainer container = new WindsorContainer(); 
[.. standard container registration stuff ..] 
container.Register(Component.For<D>().LifeStyle.Custom<ContextualLifestyle>()); 

IAFactory factory = container.Resolve<IAFactory>(); 
using (new ContainerContext(container)) 
{ 
    A a = factory.GetA(); 
} 

現在我有這個問題是我在這裏我用的是工廠的點來定義的上下文。理想情況下,D是半暫時的,並且每個實例A應該有一個實例的概念將在我註冊所有類型時在容器中配置。另一個問題是上下文需要容器本身的一個實例,這違背了三個容器調用模式。

任何人都可以提出一個更好的方式來設置這種事情,無論是使用溫莎或更好的架構。同時要記住D可能在班級層面很深,例如A -> B -> C -> E -> F -> G -> D,我想避免將D一直沿着樹狀路線傳遞。

+0

我覺得你在某個地方有漏洞抽象。爲什麼要將IDFactory注入B和C?這強烈地表明B和C將在其生命週期中創建D的多個實例,但是然後您會問如何配置Castle以便始終獲得相同的實例。簡單地向B和C注入D實例會更有意義。 – 2011-01-31 10:03:07

+0

你說得對,這正是我想要做的。我將如何去注入相同的D實例到B和C? – Geoff 2011-01-31 10:07:24

回答

3

如果你想與人分享的B和C之間的依賴關係d的同一個實例,那麼這應該足夠:

class A 
{ 
    public A(B b, C c) { } 
} 

class B 
{ 
    public B(D d) { } 
} 

class C 
{ 
    public C(D d) { } 
} 


... 
container.Register(Component.For<D>().LifeStyle.Custom<ContextualLifestyle>()); 
A a = container.Resolve<A>(); 

如果您IAFactory使用container.Resolve實現,你可以用這個來代替直接打電話。另外,如果只解析一個「頂級」組件,則可以省略顯式創建上下文。