C# Autofac:在容器生成后交换掉依赖项
仅供参考:我正在使用nuget软件包 父类库项目中存在以下GetContainer方法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
[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。