防止重复注册 - Castle Windsor

Sam*_*Lad 4 c# castle-windsor ioc-container duplicates

对不起,如果在我尝试做一些谷歌之前已经问到这个并且没有找到任何匹配,那么这里就是....

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

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

这很好用,但是我想以相同的方式注册另一个DLL以解决依赖性...

container.Register(AllTypes.FromAssemblyNamed("App.Client.Infrastructure")
    .Where(x => !x.IsAbstract && !x.IsInterface)
    .WithService.DefaultInterface()
Run Code Online (Sandbox Code Playgroud)

无论如何,如果添加相同的接口分辨率,我可以让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);
}
Run Code Online (Sandbox Code Playgroud)

max*_*ego 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);
    }
}
Run Code Online (Sandbox Code Playgroud)