Structuremap GetAllInstances返回太多副本

时间:2014-08-21 22:27:13

标签: c# .net dependency-injection structuremap

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<>的类。

1 个答案:

答案 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);
        }
    }

仍然不确定这是否是最好的方法......