2009-04-09 3 views
0

У меня возникли трудности с выяснением того, как иметь кэш StructureMap экземпляра, отличного от значения по умолчанию. Я могу кэшировать экземпляр по умолчанию с кодом, подобным этомуИспользование StructureMap для кэширования именованного экземпляра

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

который работает должным образом. И я могу создать именованный экземпляр штраф

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

Но я бы очень хотел, чтобы кэшировать «CurrentUser» на сессии, но .CacheBy() существует только в CreatePluginFamilyExpression <> и единственный способ, которым я могу сказать, чтобы получить от CreatePluginFamilyExpression <> to IsExpression <> есть свойство TheDefault, которое заставляет меня создавать по умолчанию, чего я не хочу.

ответ

1

Добавить отдельную строку с:

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

Вы не можете в данный момент настроен кэширование для конкретных случаев. То же самое происходит, если у вас есть IUser, и вы хотите различное кэширование для Пользователя, чем для другого класса, например PerRequestUser. В этом случае, если вы запрашиваете экземпляр с помощью IUser, тогда будет применяться одинаковое кэширование.

Его ограничение тока SM. Вышеизложенное может быть тем, что вам нужно. В качестве альтернативы рассмотрим прокатке свои собственные линии, которые дозвонились в месте этого выражения:

() => someAwesomeConstructor() 

Вместо этого вы могли бы назвать:

() => GetUserCachingInSession() 

И в этом методе, у вас есть простая логика, которая извлекает его из сессии , если он не получает новый, сохраняющий его в сеансе.

+0

В этом случае это прекрасно. У меня есть только один «специальный» экземпляр, поэтому проблема с кешем не является проблемой. Мне просто не нужен экземпляр по умолчанию, поскольку это может смутить кого-то, если они помещают пользователя в конструктор и внезапно вытаскивают текущего пользователя из ниоткуда. –

3

это было так близко, как я смог быстро

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

Если это работает, это должно быть именно то, что запросил плакат, больше, чем просто близко! :) Также будет означать, что Фредди ошибается в отношении ограничения SM. Наконец, я думаю, что AddInstances одобрен/рекомендован? способ добавления именованных экземпляров, так что это лучше, чем просто WithName, поскольку Jeff попробовал – Schneider

Смежные вопросы