【发布时间】:2021-10-29 21:21:45
【问题描述】:
我正在为 StructureMap 苦苦挣扎。我需要确保每个HttpContextLifecycle 都有一个实例,但每个构造函数参数都有一个实例。我们的旧工作代码是:
注册表:
For<IGenericFormInitialValueResolver<SalesforceEditContactBlock>>()
.LifecycleIs<HttpContextLifecycle>()
.Use<SalesforceEditFormInitialValueResolver>();
在FormInitialValueResolverFactory(actualType 是IGenericFormInitialValueResolver 泛型类型):
if (_iocContainer.TryGetInstance(actualType) is IGenericFormInitialValueResolver returnValue)
{
if (returnValue is ISalesforceInstanceFormInitialValueResolver salesforceInstanceFormInitialValueResolver &&
salesforceInstanceName.HasValue)
{
salesforceInstanceFormInitialValueResolver.SalesforceInstanceName = salesforceInstanceName.Value;
}
return returnValue;
}
现在我需要更改它,以便在构造函数中给出SalesforceInstanceName。但我仍然希望对于每个SalesforceInstanceName(它是一个具有 2 个值的枚举)实例都为HttpContextLifecycle 缓存。所以我通过TryGetInstance重载传递参数:
ExplicitArguments args = new ExplicitArguments();
args.Set(salesforceInstanceName ?? SalesforceInstanceName.Undefined);
if (_iocContainer.TryGetInstance(actualType, args) is IGenericFormInitialValueResolver returnValue)
{
return returnValue;
}
这以一种我得到实例但总是一个新实例的方式起作用,因此它不会在每个 http 生命周期中缓存。
所以我尝试更改注册表:
foreach (SalesforceInstanceName salesforceInstanceName in (SalesforceInstanceName[])Enum.GetValues(typeof(SalesforceInstanceName)))
{
For<IGenericFormInitialValueResolver<SalesforceEditContactBlock>>()
.Add<SalesforceEditFormInitialValueResolver>().Ctor<SalesforceInstanceName>()
.Is(salesforceInstanceName)
.LifecycleIs<HttpContextLifecycle>();
}
但现在TryGetInstance 总是返回null。
【问题讨论】:
标签: c# dependency-injection structuremap