我很难搞清楚如何让StructureMap缓存非默认实例。我可以使用像这样的代码缓存默认实例
ForRequestedType<ISession>()
.CacheBy(InstanceScope.HttpContext)
.TheDefault.Is.ConstructedBy(() => ObjectFactory.GetInstance<ISessionFactory>().OpenSession());
按预期工作。我可以创建一个精美的命名实例
InstanceOf<User>().Is.ConstructedBy(() => someAwesomeConstructor()).WithName("CurrentUser");
但我真的想通过会话缓存“CurrentUser”,但.CacheBy()只存在于CreatePluginFamilyExpression&lt;&gt;这是我能说出来的唯一方法 CreatePluginFamilyExpression&LT;&GT;到IsExpression&lt;&gt;是由属性TheDefault,它迫使我创建一个我不想要的默认值。
答案 0 :(得分:3)
这就像我能够快速得到的那样接近
ForRequestedType<IInterface>()
.AddInstances(x => x
.OfConcreteType<Implementation>()
.WithName("foo"))
.CacheBy(InstanceScope.HttpContext);
答案 1 :(得分:1)
添加一个单独的行:
ForRequestedType<User>().CacheBy(...
InstanceOf<User>().Is.ConstructedBy(...
您当前无法为特定实例配置缓存。如果你有一个IUser会发生同样的情况,并且你希望User的缓存不同于另一个类,比如PerRequestUser。在这种情况下,如果您通过IUser请求实例,则始终应用相同的缓存。
它是SM的当前限制。以上可能是你需要的。或者,考虑在表达式的位置滚动自己的行:
() => someAwesomeConstructor()
相反,你会打电话:
() => GetUserCachingInSession()
在那个方法中,你有一个简单的逻辑,可以从会话中检索它,如果它没有得到一个新的,将它保存在会话中。