评论时间过长:我不能重复这种行为。以下是一些类型和单元测试:
public interface ICommandHandler<T> where T : FooCommand { }
public class FooCommand { }
public class BarCommand : FooCommand { }
class FooCommandHandler : ICommandHandler<FooCommand> { }
class BarCommandHandler : ICommandHandler<BarCommand> { }
class BarCommandHandler2 : ICommandHandler<BarCommand> { }
[TestClass]
public class AutofacTests
{
[TestMethod]
public void ContainerResolvesExpectedDependency()
{
var container = GetContainer();
var barCommandHandlers = container.Resolve<IEnumerable<ICommandHandler<BarCommand>>>()
.ToArray();
Assert.AreEqual(2, barCommandHandlers.Length);
Assert.IsTrue(barCommandHandlers.Any(bch => bch is BarCommandHandler));
Assert.IsTrue(barCommandHandlers.Any(bch => bch is BarCommandHandler2));
Assert.IsFalse(barCommandHandlers.Any(bch => bch is FooCommandHandler));
}
private IContainer GetContainer()
{
var builder = new ContainerBuilder();
builder.RegisterType<FooCommandHandler>().As<ICommandHandler<FooCommand>>();
builder.RegisterType<BarCommandHandler>().As<ICommandHandler<BarCommand>>();
builder.RegisterType<BarCommandHandler2>().As<ICommandHandler<BarCommand>>();
return builder.Build();
}
}
我正在注册
ICommandHandler<T>
.我加了一个-
BarCommandHandler2
-因此,我可以验证是否从容器中获取了多个实现的集合。
测试通过了。我正在注册这三种类型,但当我解决
IEnumerable<ICommandHandler<BarCommand>>
我只得到了我期望的两个实现。
这是有道理的,因为
FooCommandHandler
不执行
ICommandHandler<BarCommand>
.如果容器确实解决了这个问题,那么它将是一个错误。
我的建议是查看你正在解决的部分
IEnumerable<ICommandHandler<BARCOMAND>>
.也许你在工作中有一些额外的泛型,而在运行时你实际上在解决其他问题。