使用StructureMap缓存命名实例

时间:2009-04-09 20:01:42

标签: c# structuremap

我很难搞清楚如何让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,它迫使我创建一个我不想要的默认值。

2 个答案:

答案 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()

在那个方法中,你有一个简单的逻辑,可以从会话中检索它,如果它没有得到一个新的,将它保存在会话中。