这是配置在抽象类上定义的 Autofac 委托工厂的后续问题。我已经实施了使用IIndex<K,V>@Aren 在他的回答中提出的建议,但我无法克服以下错误:
测试方法 IssueDemoProject.WidgetTest.ProblemIllustration 抛出异常:Autofac.Core.DependencyResolutionException:无法使用可用服务和参数调用类型“IssueDemoProject.WidgetWrangler”的“公共绑定标志”的构造函数:无法解析参数“IssueDemoProject。构造函数 'Void .ctor(Autofac.IComponentContext, IssueDemoProject.WidgetType)' 的 WidgetType widgetType'。
更新:应该注意的是,如果我根据参数注册不同的具体类,那是可行的。请参阅下面的第二个测试。
这是一些说明问题的示例代码。[编辑:我更新了相同的内容以使用 IIndex 查找。]
有人可以告诉我我做错了什么吗?
using Autofac;
using Autofac.Features.Indexed;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace IssueDemoProject
{
public enum WidgetType
{
Sprocket,
Whizbang
}
public class SprocketWidget : Widget
{
}
public class WhizbangWidget : Widget
{
}
public abstract class Widget
{
}
public class WidgetWrangler : IWidgetWrangler
{
public Widget Widget { get; private set; }
public WidgetWrangler(IComponentContext context, WidgetType widgetType)
{
var lookup = context.Resolve<IIndex<WidgetType, Widget>>();
Widget = lookup[widgetType];
}
}
public interface IWidgetWrangler
{
Widget Widget { get; }
}
[TestClass]
public class WidgetTest
{
// NOTE: This test throws the exception cited above
[TestMethod]
public void ProblemIllustration()
{
var container = BuildContainer(
builder =>
{
builder.RegisterType<WidgetWrangler>().Keyed<IWidgetWrangler>(WidgetType.Sprocket).
InstancePerDependency();
builder.RegisterType<WidgetWrangler>().Keyed<IWidgetWrangler>(WidgetType.Whizbang).
InstancePerDependency();
}
);
var lookup = container.Resolve<IIndex<WidgetType, IWidgetWrangler>>();
var sprocketWrangler = lookup[WidgetType.Sprocket];
Assert.IsInstanceOfType(sprocketWrangler.Widget, typeof(SprocketWidget));
var whizbangWrangler = container.ResolveKeyed<IWidgetWrangler>(WidgetType.Whizbang);
Assert.IsInstanceOfType(whizbangWrangler.Widget, typeof(WhizbangWidget));
}
// Test passes
[TestMethod]
public void Works_with_concrete_implementations()
{
var container = BuildContainer(
builder =>
{
builder.RegisterType<SprocketWidget>().Keyed<Widget>(WidgetType.Sprocket).
InstancePerDependency();
builder.RegisterType<WhizbangWidget>().Keyed<Widget>(WidgetType.Whizbang).
InstancePerDependency();
});
var lookup = container.Resolve<IIndex<WidgetType, Widget>>();
var sprocketWrangler = lookup[WidgetType.Sprocket];
Assert.IsInstanceOfType(sprocketWrangler, typeof(SprocketWidget));
var whizbangWrangler = container.ResolveKeyed<Widget>(WidgetType.Whizbang);
Assert.IsInstanceOfType(whizbangWrangler, typeof(WhizbangWidget));
}
private IComponentContext BuildContainer(Action<ContainerBuilder> additionalRegistrations)
{
var assembly = GetType().Assembly;
var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces();
builder.RegisterAssemblyTypes(assembly).AsSelf();
additionalRegistrations(builder);
IComponentContext container = builder.Build();
return container;
} }
}