C# Autofac:在容器生成后交换掉依赖项

C# Autofac:在容器生成后交换掉依赖项,c#,dependency-injection,autofac,specflow,C#,Dependency Injection,Autofac,Specflow,仅供参考:我正在使用nuget软件包 父类库项目中存在以下GetContainer方法 [ScenarioDependencies] public static ContainerBuilder GetContainerWithDependencies() { var containerBuilder = new ContainerBuilder(); containerBuilder.RegisterType<PosMgmtSce

仅供参考:我正在使用nuget软件包

父类库项目中存在以下GetContainer方法

    [ScenarioDependencies]
    public static ContainerBuilder GetContainerWithDependencies()
    {
        var containerBuilder = new ContainerBuilder();

        containerBuilder.RegisterType<PosMgmtScenarioCtx>().As<IScenarioContext>().InstancePerLifetimeScope();

        return containerBuilder;
    }
[ScenarioDependencies]
公共静态ContainerBuilder GetContainerWithDependencies()
{
var containerBuilder=新的containerBuilder();
containerBuilder.RegisterType().As().InstancePerLifetimeScope();
返回集装箱船;
}
稍后,在子项目(引用父项目)中,我尝试用新类替换接口实现,但它不起作用

    [Given(@"...Step...")]
    public void GivenGenerateEmpWithXRefCode(some params)
    {
        using 
        (
            var scope = _lifetimeScope.BeginLifetimeScope(
                builder =>  {
                    // THIS DOES NOT WORK.
                    builder.RegisterType<EmployeeScenarioCtx>().As<IScenarioContext>();
                }
            )
        )
        {                
            _createUpdatePositionStepsLogic.PostPatchTheObject(service, "POST", "Employee", url, expectedStatusCode,
                version);
        }
    }
[给定(@“…步骤…”)]
public void指定GenerateImpWithxrefCode(某些参数)
{
使用
(
var scope=\u lifetimeScope.BeginLifetimeScope(
生成器=>{
//这是行不通的。
builder.RegisterType().As();
}
)
)
{                
_createUpdatePositionStepsLogic.PostPatchTheObject(服务、“发布”、“员工”、url、预期状态代码、,
版本);
}
}
需要用EmployeeScenarioCtx而不是PosMgmtScenarioCtx替换iCenarioContext


任何帮助都将不胜感激,谢谢

您应该使用您创建的范围来解决依赖关系

var createUpdatePositionStepsLogic = scope.Resolve<...>();
var createUpdatePositionStepsLogic=scope.Resolve();

原始依赖项都已解析,因此您需要使用新的作用域重新解析它们,以便使用新的注册。

因此,我的问题应该是如何使用Autofac重写构造函数中的依赖项,对此已有很多答案。我没有声誉将我的问题标记为重复,但如有必要,请这样做

以下答案对我有帮助:

  • 下面是最终代码的外观:

    using(var scope = _lifetimeScope.BeginLifetimeScope(
                    builder =>
                    {
                        builder.RegisterType<WithPayload>().WithParameter(
                            (p, c) => p.ParameterType == typeof(IScenarioContext),
                            (p, c) => c.Resolve<EmployeeScenarioCtx>()).As<IWithPayload>();
                    }
                )
            )
            {
                switch (version)
                {
                    case PosMgmtStepsVersion.V1:
                        var withPayload = scope.Resolve<IWithPayload>();
                        withPayload.GivenPOST_PATCH_EndPoint_WithStatusCodeCheck("POST", "Employee", UniqueIdentifier,
                            url,
                            expectedStatusCode);
                        break;
                    default:
                        throw new ArgumentOutOfRangeException(nameof(version), version, null);
                }
    
    使用(var作用域=\u lifetimeScope.BeginLifetimeScope(
    生成器=>
    {
    builder.RegisterType().WithParameter(
    (p,c)=>p.ParameterType==typeof(IScenarioContext),
    (p,c)=>c.Resolve()).As();
    }
    )
    )
    {
    交换机(版本)
    {
    案例PosMgmtStepsVersion.V1:
    var withPayload=scope.Resolve();
    使用Payload.GivenPOST\u PATCH\u EndPoint\u和StatusCodeCheck(“POST”、“Employee”、UniqueIdentifier、,
    网址,
    预期状态代码);
    打破
    违约:
    抛出新ArgumentOutOfRangeException(nameof(version),version,null);
    }
    
    您的作用域在任何地方都不用于解析服务。您正在进行的注册工作都很好,但如果您不使用正在创建的子作用域来实际解析
    IScenarioContext
    ,您仍将收到旧的注册。您能指导我如何使用子作用域解析IScenarioContex吗t now?
    \u createUpdatePositionStepsLogic.PostPatchTheObject(服务,“发布”,“员工”,url,预期状态码,版本);
    最终调用带有负载的
    (IEntityMappings entityMappings、IRestRequest restRequest、IHelpers helpers、IFormatHelpers formatHelpers、iCenarioContext scenarioContext
    我的假设是现在应该自动使用子范围解析iCenarioContext。感谢您的回复。因此,
    \u createUpdatePositionStepsLogic.Postbatch对象(服务,“POST”、“Employee”、url、expectedStatusCode、version);
    正在使用有效负载调用
    (IEntityMappings entityMappings、IRestRequest restRequest、IHelpers helpers、IFormatHelpers formatHelpers、IScenarioContext scenarioContext等)
    我的期望是,现在应该使用EmployeeScenarioCtx自动解析iSenarioContext。