2016-11-09 44 views
1

之間,我的工作是處理財務數據,對各種金融工具,在幾個不同的時間框架的系統上。DryIOC共享單身外立面

例如:

EUR/USD 
    - m1 Timeframe (1 Minute) 
    - m5 Timeframe (5 Minute) 
    - m15 Timeframe (15 Minute) 
GBP/USD 
    - m1 Timeframe (1 Minute) 
    - m5 Timeframe (5 Minute) 
    - m15 Timeframe (15 Minute) 

的時間範圍分別具有一個相當複雜的處理管線,以及我使用DryIOC路由數據通過管道,使用EventAggregator如下所述:DryIOC Event Aggregator

DryIOC對於它來說非常完美,因爲它的速度超快,可以跟上我需要的數據量/事件數量。

我有依賴關係,其在此儀器的水平,需要被該文書的不同的時段之間被共享。

而且我也有全球的相關性,如需要被所有儀器和所有時限之間共享的代理連接管理器。

容器在運行時創建;我可以打開/關閉不同的儀器和時間表,並需要製作一個新的容器。

門面似乎是完美的。我可以從一個全局容器開始,對於任何被激活的儀器,爲儀器製作一個Facade。並從該容器爲每個時間範圍製作一個容器。 Facade容器中的解決方案使用在此處定義的本地註冊,然後在未解決時回退到父級。

然而,由於在文檔描述的外立面有自己的單身人士。當我嘗試從一個Facade作爲一個單例解析全局依賴時,我得到一個新實例。

該測試失敗:

[Test] 
public void Test() 
{ 
    var globalContainer = new Container(); 

    globalContainer.Register<IGlobalDependency, GlobalDependency>(Reuse.Singleton); 

    var EURUSD_Container = new Container(rules => rules.WithFallbackContainer(globalContainer)); 

    EURUSD_Container.Register<IInstrumentDependency, InstrumentDependency>(Reuse.Singleton); 

    var EURUSD_Timeframe_1_Container = EURUSD_Container.CreateFacade(); 

    EURUSD_Timeframe_1_Container.Register<ITimeframeDependency, TimeframeDependency>(Reuse.Singleton); 

    var EURUSD_Timeframe_2_Container = EURUSD_Container.CreateFacade(); 
    EURUSD_Timeframe_2_Container.Register<ITimeframeDependency, TimeframeDependency>(Reuse.Singleton); 


    var globalfromTimeframe1 = EURUSD_Timeframe_1_Container.Resolve<IGlobalDependency>(); 
    var globalfromTimeframe2 = EURUSD_Timeframe_2_Container.Resolve<IGlobalDependency>(); 

    Assert.AreSame(globalfromTimeframe1, globalfromTimeframe2); 
} 

我花了三天外立面作戰,範圍,NamedScopes和所有這些東西的組合。範圍不起作用,因爲如果我爲一個工具創建一個新範圍,然後爲該工具中的每個時間範圍創建一個新範圍,並使用InCurrent範圍解決問題 - 我仍然得到一個新版本,因爲每個時間範圍都在自己的範圍內。

命名範圍沒有工作,因爲我只知道在運行時的樂器名稱,併爲新的工具添加新的登記,時限相撞。

我怎樣才能保持獨立子容器,但隨後與他們的父母分享單身?

更新:

public void ScopeTest() 
{ 
    var globalContainer = new Container(); 

    globalContainer.Register<IGlobalDependency, GlobalDependency>(Reuse.Singleton); 

    var EURUSD_Container = globalContainer.OpenScope("EUR/USD"); 

    EURUSD_Container.Register<IInstrumentDependency, InstrumentDependency>(Reuse.InCurrentNamedScope("EUR/USD"), serviceKey: "EUR/USD"); 

    var EURUSD_Timeframe_1_Container = EURUSD_Container.OpenScope("m1"); 

    EURUSD_Timeframe_1_Container.Register<ITimeframeDependency, TimeframeDependency>(Reuse.InCurrentNamedScope("m1"), serviceKey: "m1"); 

    var EURUSD_Timeframe_2_Container = EURUSD_Timeframe_1_Container.OpenScope("m5"); 

    EURUSD_Timeframe_2_Container.Register<ITimeframeDependency, TimeframeDependency>(Reuse.InCurrentNamedScope("m5"), serviceKey:"m5"); 

    var USDJPY_Container = globalContainer.OpenScope("USD/JPY"); 

    EURUSD_Container.Register<IInstrumentDependency, InstrumentDependency>(Reuse.InCurrentNamedScope("USD/JPY"), serviceKey: "USD/JPY"); 

    var USDJPY_Timeframe_1_Container = USDJPY_Container.OpenScope("m1"); 

    USDJPY_Timeframe_1_Container.Register<ITimeframeDependency, TimeframeDependency>(Reuse.InCurrentNamedScope("m1"), serviceKey:"m1"); 

    var USDJPY_Timeframe_2_Container = USDJPY_Container.OpenScope("m5"); 

    USDJPY_Timeframe_2_Container.Register<ITimeframeDependency, TimeframeDependency>(Reuse.InCurrentNamedScope("m5"), serviceKey:"m5"); 

    var globalfromEURUSDTimeframe1 = EURUSD_Timeframe_1_Container.Resolve<IGlobalDependency>(); 
    var globalfromEURUSDTimeframe2 = EURUSD_Timeframe_2_Container.Resolve<IGlobalDependency>(); 

    var globalfromUSDJPYTimeframe1 = EURUSD_Timeframe_1_Container.Resolve<IGlobalDependency>(); 
    var globalfromUSDJPYTimeframe2 = EURUSD_Timeframe_2_Container.Resolve<IGlobalDependency>(); 

    Assert.AreSame(globalfromEURUSDTimeframe1, globalfromEURUSDTimeframe2); 
    Assert.AreSame(globalfromUSDJPYTimeframe1, globalfromUSDJPYTimeframe2); 
    Assert.AreSame(globalfromEURUSDTimeframe1, globalfromUSDJPYTimeframe2); 
} 

產生以下異常:

DryIoc.ContainerException: Unable to register service Namespace.ITimeframeDependency - {DI=25, ImplType="Namespace.TimeframeDependency", Reuse=CurrentScopeReuse {Name="m1", Lifespan=100}} with duplicate key [m1]. Already registered service with same key is {ID=22.... etc.... Name="m1" 

在一個側面說明了從Visual Studio測試運行那麼討厭你無法複製的例外。

+0

我假設你之後正在處理你的外牆?共享單身人士應該發生什麼? – dadhi

+0

你能詳細說明爲什麼命名示波器不適合你,可能是通過一個小例子嗎? – dadhi

+0

用示例更新了問題 – reach4thelasers

回答

2

我管理到底實現這種通過使用WithRegistrationsCopy()

例如

_localContainer = container.WithRegistrationsCopy(); 

這可以讓我獲得頂級單實例在子容器,但也有不知道的其他容器子容器的具體登記。

+0

很高興爲你效勞。我感興趣的是使用外觀/子容器來改進V3中的事物的實際案例:https://bitbucket.org/dadhi/dryioc/issues/270/diagnose-fallback-facade-container – dadhi