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)
我不知道你是否可以调整注册商来抛出异常,但这个简单的代码片段可能对你有帮助
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)
| 归档时间: |
|
| 查看次数: |
1997 次 |
| 最近记录: |