StructureMap Open Generics и CacheBy Singleton - PullRequest
2 голосов
/ 27 августа 2009

У меня есть несколько репозиториев, которые наследуются от репозитория базового класса. В настоящее время я регистрирую реализации в памяти с помощью Структурной карты следующим образом (и она прекрасно работает):

ForRequestedType<Repository<Timeslot>>()
    .TheDefaultIsConcreteType<InMemoryRepository<Timeslot>>()
    .AsSingletons();

ForRequestedType<Repository<Appointment>>()
    .TheDefaultIsConcreteType<InMemoryRepository<Appointment>>()
    .AsSingletons();

Я подумал, что было бы неплохо использовать поддержку StructureMap для Open Generics для регистрации всего этого (число растет), поэтому при добавлении нового репозитория мне не нужно будет обновлять ServiceRegistry.

Я пробовал это:

ForRequestedType(typeof (Repository<>))
    .CacheBy(InstanceScope.Singleton)
    .TheDefaultIsConcreteType(typeof (InMemoryRepository<>));

Кажется, это не работает. Это не исключение, но действует так, как будто репозитории не являются синглетонами. Все, что добавлено к ним, не сохраняется в течение жизненного цикла приложения.

Можно ли зарегистрировать открытый универсальный объект и кэшировать реализации с помощью одноэлементной области видимости? Это приложение ASP.NET MVC, и я просто хочу, чтобы хранилища работали до тех пор, пока приложение не будет перезапущено.

1 Ответ

0 голосов
/ 09 июля 2013

У меня был похожий сценарий, и я смог успешно справиться с ним, используя более новый свободный синтаксис (используя StructureMap 2.6.3.0):

x.For(typeof(Repository<>))
 .LifecycleIs(InstanceScope.Singleton)
 .Use(typeof(InMemoryRepository<>));
...