이것은 Configuring an Autofac delegate factory that's defined on an abstract class의 후속 질문입니다. 나는 그의 대답했다 @Aren IIndex<K,V>
를 사용하는 제안을 구현했지만, 나는 다음과 같은 오류를 극복 할 수 없어요 :Autofac이 IIndex를 통해 키 등록에 관한 질문을 해결합니다
Test method IssueDemoProject.WidgetTest.ProblemIllustration threw exception: Autofac.Core.DependencyResolutionException: None of the constructors found with 'Public binding flags' on type 'IssueDemoProject.WidgetWrangler' can be invoked with the available services and parameters: Cannot resolve parameter 'IssueDemoProject.WidgetType widgetType' of constructor 'Void .ctor(Autofac.IComponentContext, IssueDemoProject.WidgetType)'.
UPDATE : 내가 다른 구체적인 클래스를 등록하면 기반 주목해야한다 작동하는 매개 변수 아래 두 번째 테스트를 참조하십시오.
다음은이 문제를 설명하는 몇 가지 샘플 코드입니다. [편집 : 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;
} }
}
내가 잘못 생각했습니다. 자세한 답변을 입력 해 주셔서 감사합니다. 잘못되어 가고 있습니다. 정말 고마워요! – neontapir