2013-05-29 82 views
4

對不起,如果這已問我試着做一些谷歌,荷蘭國際集團,並沒有發現任何匹配所以這裏去之前....防止重複登記 - 溫莎城堡

我有一個溫莎城堡容器添加我的組件使用下面的方法(其中容器的IWindsorContainer一個實例)...

container.Register(AllTypes.FromAssemblyNamed("App.Infrastructure") 
    .Where(x => !x.IsAbstract && !x.IsInterface) 
    .WithService.DefaultInterface() 

這個偉大的工程,但我當時想註冊相同的方式另一個DLL來解決從依賴關係。 ..

無論如何,我可以讓Windsor通知我是否添加了相同的界面分辨率,即:每個界面只有1個實施者(如果存在多個界面,則首先執行)。

希望我已經很好地解釋了我自己。我正在使用Castle Windsor版本:2.5.1.0並且升級/更改版本不是真正的選項。


更新:

我通過他們已經註冊後去除重複登記解決了這個。 後完成註冊,然後我有以下的循環......

var registeredServices = new Dictionary<Type, string>(); 
foreach (var node in container.Kernel.GraphNodes) 
{ 
    var cmp = ((Castle.Core.ComponentModel)node); 
    Type t = cmp.Service; 
    if (registeredServices.ContainsKey(t)) 
     container.Kernel.RemoveComponent(cmp.Name); 
    else 
     registeredServices.Add(t, cmp.Implementation.FullName); 
} 
+0

它應該是第一次註冊解決的默認行爲 – maxlego

+0

Hi @ maxlego。我不明白你的意思,請你詳細說明你的意思。如果您使用相同的界面註冊多個組件,請使用 –

+1

。那麼當你通過這個接口解決你將獲得第一個註冊的組件。據我瞭解,這是你想要的。或者不是? – maxlego

回答

6

我不知道你是否可以調整註冊拋出異常,但是這個簡單的代碼片段可以幫助你

var registeredServices = new List<Type>(); 

foreach (var node in container.Kernel.GraphNodes) 
{ 
    foreach (var t in ((Castle.Core.ComponentModel)node).Services) 
    { 
     if (registeredServices.Contains(t)) 
      throw new Exception(string.Format("service {0} already registered", t)); 
     registeredServices.Add(t); 
    } 
} 
4

在2.5就可以了,註冊後一切,叫

var allHandlers = container.Kernel.GetAssingableHandlers(typeof(object)); 

那麼你可以看看每個處理器的.Service並尋找是否有任何重複,eith呃拋出一個有用的例外或沿着這些線。

我想這是你想在測試中做的事情,而不是在運行時。

+0

typo there - container.Kernet:} – maxlego

+0

謝謝Krzysztof,這正是我想要執行檢查的位置。我們有一個單元測試尋找重複註冊失敗,我希望有一種方法來檢測什麼是重複的。謝謝你們會嘗試你們的解決方案並報告我的發現! –