2009-04-09 91 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