Structuremap 2.6.4.1
在测试中我有3个实例如下(AHandler,BHandler,CHandler)
public class AHandler : ICommandHandler<Event1> {... }
这是ICommandHandler<Event1>
的唯一三个实现。
由于某种原因,它失败了,因为它返回每个实例中的两个!
Console.WriteLine(ObjectFactory.Container.WhatDoIHave());
ObjectFactory.GetAllInstances<ICommandHandler<Event1>>().Count.ShouldEqual(3);
以下是Event1
WhatDoIHave
的唯一提及
ICommandHandler\`1<Event1> (ICommandHandler\`1<Event1>)
Scoped as: Transient
27972b30-e8a9-46ce-9a8b-f6b2ae1f0907
19e38715-a501-44d9-a003-4a5cec06034f
7f4d0d0d-a20a-4347-86f3-104b0f586fca
Ogre.Tests.Events.CommandHandlerOptions+AHandler, Ogre.Tests, Version=3.13.0.21139, Culture=neutral, PublicKeyToken=null
Ogre.Tests.Events.CommandHandlerOptions+BHandler, Ogre.Tests, Version=3.13.0.21139, Culture=neutral, PublicKeyToken=null
Ogre.Tests.Events.CommandHandlerOptions+CHandler, Ogre.Tests, Version=3.13.0.21139, Culture=neutral, PublicKeyToken=null
所以那里有6个实例,但我不知道那些GUID是什么,或者我如何得到所有内容的单个实例。
我按如下方式配置结构图
ObjectFactory.Configure(x => x.Scan(s => {
s.TheCallingAssembly();
s.AssemblyContainingType<OgreEvents>();
s.WithDefaultConventions();
s.RegisterConcreteTypesAgainstTheFirstInterface();
s.ConnectImplementationsToTypesClosing(typeof(ICommandHandler<>));
}));
经过调查,似乎删除了RegisterConcreteTypesAgainstTheFirstInterface
来电修复此问题,因此我猜测它与以下行冲突。但是这两个都是我需要的约定(即我有一些实现多个ICommandHandler<>
的类。
答案 0 :(得分:0)
我发现以下问题解决了这个问题
ObjectFactory.Configure(x => x.Scan(s => {
s.TheCallingAssembly();
s.AssemblyContainingType<OgreEvents>();
s.WithDefaultConventions();
s.Convemtnion<RegisterAllConcreteTypesAgainstAllInterfaces>();
}));
其中
public class RegisterAllConcreteTypesAgainstAllInterfaces : IRegistrationConvention
{
public void Process(Type type, Registry registry) {
if (type.IsAbstract || type.IsInterface || type.IsOpenGeneric())
return;
foreach(var i in type.GetInterfaces();
registry.For(i).Use(type);
}
}
仍然不确定这是否是最好的方法......