Redis в StructureMap
В StructureMap достаточно кода для регистрации этой службы. Синглтоны немного отличаются в этой системе, и вам лучше использовать «фабричный» шаблон для создания и управления вашим Redis-кешем. У SM есть автофабрика , которая сделает свое дело.
Если хотите, я могу опубликовать здесь базовый код. Но - вам нужно протестировать в вашей среде, чтобы заставить его работать (я не фанат размещения теоретического кода здесь в стеке).
Если вы раньше не использовали redis, я бы создал консольное приложение и удостоверился, что вы можете его настроить и запустить, прежде чем вставлять IOC и ваше приложение .Net MVC в рисунок (вы сильный кодер, так что я не скажу тебе кое-что, чего ты там еще не знаешь).
Могут ли другие ваши приложения использовать кэш Redis?
Да. Пока они имеют доступ к создаваемой вами конечной точке (в приведенном выше коде она прослушивает localhost:6379
).
Вы можете просто использовать ту же настройку «config», что и в своем приложении MVC. Когда вы это сделаете, оба приложения попадут на один и тот же сервер «redis» и будут использовать одни и те же кэшированные объекты.
Думайте о redis так же, как вы думаете о своей базе данных: если обе системы используют одну и ту же «конфигурацию» (например, строку подключения), они могут получать доступ к одним и тем же данным.
Redis супер-быстрый и действительно крутой. Тебе это понравится!
Образец кода, полностью не проверенный
Вот краткий обзор, чтобы мой комментарий по структуре кода имел больше смысла. Если у других есть предложения по настройке, не стесняйтесь добавлять к комментариям, и я буду обновлять.
public interface ICacheManagerConfigFactory {
ICacheManagerConfiguration CreateCacheManager();
}
public CacheManagerFactory:ICacheManagerConfigFactory {
private static ICacheManagerConfiguration _cache;
private static object syncRoot = new Object();
public ICacheManagerConfiguration CreateCacheManager() {
if(_cache!=null) { return _cache; }
//locking to make sure that we only create 1 _cache object (thread-safe)
lock(syncRoot) {
//idiot-proofing our thread-safe code
if(_cache!=null) { return _cache; }
//create _cache if it doesn't already exist
var jss = new JsonSerializerSettings {
NullValueHandling = NullValueHandling.Ignore,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
_cache= new CacheManager.Core.ConfigurationBuilder()
.WithJsonSerializer(serializationSettings: jss, deserializationSettings: jss)
... etc ...
.Build();
}
return _cache;
}
}
И это всего лишь метод быстрого тестирования, который доказывает, что мы можем извлечь статическую конфигурацию из памяти. Он также взят из документации SM для автозавода.
public void Simple_factory_creation() {
var container = new Container(cfg => {
cfg.For<ICacheManagerConfiguration>().Use<CacheManagerFactory>();
cfg.For<ICacheManagerConfigFactory>().CreateFactory();
});
var cache = container.GetInstance<ICacheManagerConfiguration>();
}