我很抱歉用我的小问题打扰了社区,但我只是被困住了!
在此之前我们详细介绍了服务模块的容器设置!
public class ServiceModule : Module
{
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);
builder.Register(c => new ContextService(c.Resolve<IContextDataProvider>(),
c.ResolveNamed<IExceptionShield>("SRV_HOST_SHIELD"),
c.Resolve<IMonitoring>()))
.As<IContextService>();
builder.Register(c => new ExceptionShield(
c.ResolveNamed<IShieldConfiguration>("SRV_SHIELD_CONFIG")))
.Named<IExceptionShield>("SRV_HOST_SHIELD");
builder.Register(c => new ServiceExceptionShieldConfiguration()).Named<IShieldConfiguration>("SRV_SHIELD_CONFIG");
builder.RegisterType<ContextService>().Named<object>("Service.ContextService");
}
}
我一直在讨论的问题是服务构造函数的第二个参数不能解决。
我已经尝试了所有,我所知道的排列,包括在没有容器分辨率的情况下简单地初始化参数。但所有目的都在同一个例外:
None of the constructors found with 'Public binding flags' on type 'Service.ContextService' can be invoked with the available services and parameters:
Cannot resolve parameter 'Common.ExceptionShield.IExceptionShield exceptionShield' of constructor 'Void .ctor(IContextDataProvider, Common.ExceptionShield.IExceptionShield, Common.Monitoring.IMonitoring)'.
我必须错过这里至关重要的事情。如果你看到我的错误,那么请告诉我:)
答案 0 :(得分:2)
发现问题。这是我忽略的一件小事。
Autofac仅采用类型的最后一个定义。因为我重新注册了最后一个定义的类型。
这只是问题的一部分。另一部分(生成有趣的异常消息的部分)是RegisterType()尝试自动装配该类型的事实。并且因为除了异常屏蔽之外,所有对象都可以通过它们的类型找到。
工作配置如下所示:
public class ServiceModule : Module
{
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);
builder.Register(c => new ContextService(c.Resolve<IContextDataProvider>(),
c.ResolveNamed<IExceptionShield>("SRV_HOST_SHIELD"),
c.Resolve<IMonitoring>()))
.Named<object>("Service.ContextService");
builder.Register(c => new ExceptionShield(
c.ResolveNamed<IShieldConfiguration>("SRV_SHIELD_CONFIG")))
.Named<IExceptionShield>("SRV_HOST_SHIELD");
builder.Register(c => new ServiceExceptionShieldConfiguration()).Named<IShieldConfiguration>("SRV_SHIELD_CONFIG");
}
}
容易犯错,花了我几个小时才弄明白。希望这能帮助其他失去灵魂的人。