0

我很难弄清楚如何让 StructureMap 缓存一个非默认实例。我可以用这样的代码缓存默认实例

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

按预期工作。我可以很好地创建一个命名实例

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

但是我真的很想按会话缓存“CurrentUser”,但是 .CacheBy() 只存在于 CreatePluginFamilyExpression<> 中,我可以告诉从 CreatePluginFamilyExpression<> 到 IsExpression<> 的唯一方法是通过属性 TheDefault,它强制我创建一个我不想要的默认值。

4

2 回答 2

3

这是我能够快速到达的最接近的地方

ForRequestedType<IInterface>()
    .AddInstances(x => x
        .OfConcreteType<Implementation>()
        .WithName("foo"))
    .CacheBy(InstanceScope.HttpContext);
于 2009-04-11T16:06:24.810 回答
1

添加一个单独的行:

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

您目前无法为特定实例配置缓存。如果您有一个 IUser,并且您希望 User 的缓存与另一个类的缓存不同,例如 PerRequestUser,也会发生同样的情况。在这种情况下,如果您通过 IUser 请求实例,那么将始终应用相同的缓存。

它是 SM 的当前限制。以上可能是您需要的。或者,考虑滚动您自己的行来代替此表达式:

() => someAwesomeConstructor()

相反,你会打电话:

() => GetUserCachingInSession()

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

于 2009-04-12T13:25:06.700 回答