首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止重复注册-温莎城堡

防止重复注册-温莎城堡
EN

Stack Overflow用户
提问于 2013-05-29 13:43:43
回答 2查看 2.3K关注 0票数 4

对不起,如果在我尝试做谷歌搜索之前有人问过这个问题,但没有找到匹配的,那么就这样吧……

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

代码语言:javascript
复制
container.Register(AllTypes.FromAssemblyNamed("App.Infrastructure")
    .Where(x => !x.IsAbstract && !x.IsInterface)
    .WithService.DefaultInterface()

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

代码语言:javascript
复制
container.Register(AllTypes.FromAssemblyNamed("App.Client.Infrastructure")
    .Where(x => !x.IsAbstract && !x.IsInterface)
    .WithService.DefaultInterface()

现在,我可以让温莎通知我,如果添加了相同的接口分辨率,即:每个接口只有一个实现者(如果存在多个接口,则选择第一个)。

希望我已经解释得够清楚了。我使用的是Castle版本: 2.5.1.0,升级/更改版本并不是真正的选择。

更新:

我已经解决了这个问题,删除复本注册后,他们已经注册。注册完成后,下面有一个循环.

代码语言:javascript
复制
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);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-29 21:45:52

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

代码语言:javascript
复制
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);
    }
}
票数 6
EN

Stack Overflow用户

发布于 2013-05-29 21:50:55

在2.5中,您可以在注册所有内容之后,拨打

代码语言:javascript
复制
var allHandlers = container.Kernel.GetAssingableHandlers(typeof(object));

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16815595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档