之間,我的工作是處理財務數據,對各種金融工具,在幾個不同的時間框架的系統上。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測試運行那麼討厭你無法複製的例外。
我假設你之後正在處理你的外牆?共享單身人士應該發生什麼? – dadhi
你能詳細說明爲什麼命名示波器不適合你,可能是通過一個小例子嗎? – dadhi
用示例更新了問題 – reach4thelasers