C# 防止重复注册-温莎城堡

C# 防止重复注册-温莎城堡,c#,duplicates,castle-windsor,ioc-container,C#,Duplicates,Castle Windsor,Ioc Container,很抱歉,如果在我尝试使用谷歌搜索之前有人问我这个问题,但没有找到任何匹配项,那么就这样 我有一个Castle Windsor容器,我使用以下方法将组件添加到其中(其中容器是IWindsorContainer的实例) 这是伟大的作品,但我想注册另一个DLL在同样的方式来解决依赖性从那 container.Register(AllTypes.FromAssemblyNamed("App.Client.Infrastructure") .Where(x => !x.IsAbstract

很抱歉,如果在我尝试使用谷歌搜索之前有人问我这个问题,但没有找到任何匹配项,那么就这样

我有一个Castle Windsor容器,我使用以下方法将组件添加到其中(其中容器是
IWindsorContainer
的实例)

这是伟大的作品,但我想注册另一个DLL在同样的方式来解决依赖性从那

container.Register(AllTypes.FromAssemblyNamed("App.Client.Infrastructure")
    .Where(x => !x.IsAbstract && !x.IsInterface)
    .WithService.DefaultInterface()
现在我可以让Windsor通知我是否添加了相同的接口解决方案,即:每个接口只有一个实现者(如果存在多个实现者,则使用第一个)

希望我已经解释清楚了。我使用的是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);
}
var registeredServices=newdictionary();
foreach(container.Kernel.GraphNodes中的var节点)
{
var cmp=((Castle.Core.ComponentModel)节点);
t型=cmp.服务;
if(registeredServices.ContainsKey(t))
container.Kernel.RemoveComponent(cmp.Name);
其他的
Add(t,cmp.Implementation.FullName);
}

我不知道您是否可以调整注册器来抛出异常,但这个简单的代码片段可能会帮助您

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);
    }
}
var registeredServices=new List();
foreach(container.Kernel.GraphNodes中的var节点)
{
foreach(var t in((Castle.Core.ComponentModel)节点).Services)
{
if(registeredServices.Contains(t))
抛出新异常(string.Format(“服务{0}已注册”,t));
registeredServices.Add(t);
}
}

在2.5中,注册所有内容后,您可以调用

var allHandlers = container.Kernel.GetAssingableHandlers(typeof(object));
然后,您可以查看每个处理程序的
.Service
,并查找是否存在重复项,然后抛出一个有用的异常或类似于这些内容的内容


我想这是您希望在测试中执行的操作,而不是在运行时。

默认情况下,第一次注册应该是resolvedHi@maxlego。我不明白你的意思,请你详细说明一下你的意思。如果你用同一个接口注册了多个组件。然后,当您通过该接口解析时,您将获得第一个注册的组件。据我所知,这是你想要的。或者不是吗?谢谢@maxlego,我希望它抛出一个异常或类似的东西,因为我们每个接口只需要一个注册组件,如果我没有在我的问题中明确说明的话,很抱歉。谢谢Krzysztof,这正是我尝试执行签入的位置。我们有一个单元测试,寻找失败的重复注册,我希望找到一种方法来检测复制的内容。谢谢大家,我会尝试你们的解决方案并报告我的发现!
var allHandlers = container.Kernel.GetAssingableHandlers(typeof(object));