我正在為 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。
uj5u.com熱心網友回復:
如果您通過ExplicitArguments. 您可能希望像這樣使用命名實體:
foreach (SalesforceInstanceName salesforceInstanceName in (SalesforceInstanceName[])Enum.GetValues(typeof(SalesforceInstanceName)))
{
For<IGenericFormInitialValueResolver<SalesforceEditContactBlock>>()
.Use<SalesforceEditFormInitialValueResolver>()
.Ctor<SalesforceInstanceName>()
.Is(salesforceInstanceName)
.Named(salesforceInstanceName.ToString())
.LifecycleIs<HttpContextLifecycle>();
}
您基本上說,對于SalesforceInstanceNameenum 的每個值,您將SalesforceEditFormInitialValueResolver使用該列舉值作為建構式引數注冊單獨的命名實體(具有所述列舉值的名稱)。
然后解決,而不是使用ExplicitArguments,使用名稱:
container.TryGetInstance(actualType, salesforceInstanceName.ToString());
uj5u.com熱心網友回復:
在我看到Evk 的答案之前,我已經有了一個可行的解決方案(我現在將檢查):
IGenericFormInitialValueResolver genericFormResolver = _iocContainer.GetAllInstances(actualType)
.OfType<IGenericFormInitialValueResolver>()
.FirstOrDefault(resolver => resolver is ISalesforceInstanceFormInitialValueResolver sr && sr.SalesforceInstanceName == salesforceInstanceName);
if (genericFormResolver != null)
{
return genericFormResolver;
}
所以我使用iocContainer.GetAllInstances獲取所有(3)個實體,然后過濾我需要的一個。我猜 Evk 的方法更簡潔,而且可能更高效。
更新:我測驗了 Evk 的方法,它運行良好。我總是為每個實體創建一個快取實體,SalesforceInstanceName它比我的更好的是:僅構建所需的實體,而不是全部。如果有人需要替代方案,我會保留此答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/341585.html
上一篇:unity剛體移動時上升并反彈
下一篇:確定一個值在c#中的范圍
