使用Castle在集合中注册相同的类型.温莎例外
本文关键字:类型 Castle 集合 注册 使用 | 更新日期: 2023-09-27 18:04:16
我正在尝试与Castle进行DI。温莎到List中的组件。
我有三种类型的类(在本例中是Boats),它们都继承自一个接口(IBoat),并且我随机生成了这些类型的10个实例。当它添加不同的类型时,一切正常,但是当它要添加集合中已经存在的相同类型时,它给出以下错误:
Component MarinaTest.SailBoat could not be registered.
There is already a component with that name. Did you want to modify the existing
component instead? If not, make sure you specify a unique name.
包含集合的父类如下:
public class BoatsAtSea
{
public List<IBoat> BoatsList { get; set; }
public BoatsAtSea(List<IBoat> boatsAtSea)
{
BoatsList = boatsAtSea;
}
}
和我使用的Castle代码:
Type[] types = {typeof(SailBoat), typeof(FisherBoat), typeof(YachtBoat)};
var basContainer = new WindsorContainer();
basContainer.Kernel.Resolver.AddSubResolver(new ListResolver(basContainer.Kernel));
basContainer.Register(Component.For<BoatsAtSea>());
// Generate 10 random boats
for (int i = 0; i < 10; i++)
{
basContainer.Register(Component.For<IBoat>().LifestyleTransient().ImplementedBy(types[new Random().Next(3)])
.DependsOn(Dependency.OnValue("Name", "BT"+ i)));
}
BoatsAtSea boats = basContainer.Resolve<BoatsAtSea>();
我尝试了几种选择,但我不知道是什么错了。谢谢。
您应该注册一次实现:
container.Register(Classes.FromThisAssembly()
.IncludeNonPublicTypes()
.BasedOn<IBoat>()
.WithService.FromInterface()
.LifestyleTransient());
然后创建一个获取随机IBoat
实现的方法:
private IEnumerable<IBoat> GetRandomBoatImplementation(IKernel container, int count)
{
for (int i = 0; i < count; i++)
{
yield return container.ResolveAll<IBoat>()
.OrderBy(item => Guid.NewGuid())
.FirstOrDefault();
}
}
使用此方法创建列表。这使得ListResolver变得多余,因为我们自己在注册类型:
container.Register(Component.For<List<IBoat>>()
.UsingFactoryMethod(input => GetRandomBoatImplementation(input, 10).ToList()));
同一个组件(类型)不能显式注册多次。
根据您的代码,for循环导致多次注册相同的类型(从您的类型数组中选择)
如果使用Named:
为组件命名,就可以做到这一点basContainer.Register(Component.For<IBoat>()
.LifestyleTransient()
.ImplementedBy(types[new Random().Next(3)])
.Named("BT"+i)
.DependsOn(Dependency.OnValue("Name", "BT"+ i)));
还必须更改:
BoatsAtSea(List<IBoat> boatsAtSea)
:
BoatsAtSea(IList<IBoat> boatsAtSea)
亲切的问候,
Marwijn .