对不起,如果在我尝试做谷歌搜索之前有人问过这个问题,但没有找到匹配的,那么就这样吧……
我有一个Castle容器,我使用以下方法将组件添加到其中(其中容器是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()现在,我可以让温莎通知我,如果添加了相同的接口分辨率,即:每个接口只有一个实现者(如果存在多个接口,则选择第一个)。
希望我已经解释得够清楚了。我使用的是Castle版本: 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);
}发布于 2013-05-29 21:45:52
我不知道您是否可以调整注册程序来抛出异常,但是这个简单的代码片段可能会帮助您
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-29 21:50:55
在2.5中,您可以在注册所有内容之后,拨打
var allHandlers = container.Kernel.GetAssingableHandlers(typeof(object));然后,您可以查看每个处理程序的.Service,找出是否有重复的,然后抛出一个有用的异常或类似的东西。
我想这是您想要在测试中做的事情,而不是在运行时。
https://stackoverflow.com/questions/16815595
复制相似问题