2013-05-29 67 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,这正是我想要执行检查的位置。我们有一个单元测试寻找重复注册失败,我希望有一种方法来检测什么是重复的。谢谢你们会尝试你们的解决方案并报告我的发现! –