2009-04-09 95 views
0

我很難搞清楚如何讓StructureMap緩存一個非默認實例。我可以用這樣的代碼緩存默認實例使用StructureMap來緩存命名實例

ForRequestedType<ISession>() 
      .CacheBy(InstanceScope.HttpContext) 
      .TheDefault.Is.ConstructedBy(() => ObjectFactory.GetInstance<ISessionFactory>().OpenSession()); 

它按預期工作。我可以創建一個命名實例細

InstanceOf<User>().Is.ConstructedBy(() => someAwesomeConstructor()).WithName("CurrentUser"); 

但我真的想通過會話緩存「當前用戶」,但.CacheBy()只在CreatePluginFamilyExpression <存在>的唯一途徑,我可以告訴從得到 CreatePluginFamilyExpression <> IsExpression <>是由屬性TheDefault,這迫使我創建一個默認,我不想。

回答

1

添加一個單獨的符合:具體實例

ForRequestedType<User>().CacheBy(... 
InstanceOf<User>().Is.ConstructedBy(... 

您當前無法配置緩存。如果你有一個IUser,你會得到同樣的結果,你需要爲用戶提供不同於另一個類的緩存,比如PerRequestUser。在這種情況下,如果您正在通過IUser請求實例,則始終應用相同的緩存。

它是SM的當前限制。以上可能是你需要的。另外,考慮滾動你自己的線路是被調用在此表達的地方:

() => someAwesomeConstructor() 

相反,你會打電話:

() => GetUserCachingInSession() 

而且在該方法中,你必須從會議檢索它簡單的邏輯,如果它沒有得到一個新的保存在會話中。

+0

在這種情況下,它非常好。我只有一個「特殊」實例,所以只有一個緩存範圍不是問題。我只是不想要一個默認實例,因爲如果他們把一個用戶放在構造函數中並突然將當前用戶從無處剔除,可能會使某人感到困惑。 – 2009-04-13 14:34:44

3

這是親如我能得到迅速

ForRequestedType<IInterface>() 
    .AddInstances(x => x 
     .OfConcreteType<Implementation>() 
     .WithName("foo")) 
    .CacheBy(InstanceScope.HttpContext); 
+0

如果這項工作,這應該正是海報要求,不僅僅是接近! :)也意味着弗雷迪是關於SM限制的錯誤。最後我認爲AddInstances是被批准/推薦的?添加命名實例的方式,因此它比WithName更好,因爲Jeff試圖使用 – Schneider 2009-04-16 14:03:07