4

抱歉,如果在我尝试做一些谷歌搜索并且没有找到任何匹配项之前有人问过这个问题,那么这里就……

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

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

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

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

现在无论如何我都可以让 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);
}
4

2 回答 2

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);
    }
}
于 2013-05-29T21:45:52.730 回答
4

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

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

然后您可以查看每个处理程序.Service并查找是否有任何重复项,然后抛出一个有用的异常或类似的东西。

我想这是你想在测试中做的事情,而不是在运行时。

于 2013-05-29T21:50:55.437 回答