Я изо всех сил пытаюсь получить кэширование второго уровня и транзакции, работающие на моем сайте asp.net-mvc, и я думаю, что это связано с тем, как у меня установлена настройка управления сеансами.Каков рекомендуемый способ управления сеансом nhibernate в asp.net-mvc, который поддерживает кеш-сервер второго уровня и т. Д.?
В принципе у меня есть следующие классы:
- NhibernateRepository
- SessionManager
и я с помощью Unity Container МОК:
this.RegisterType<IRepository, NHibernateRepository>(new PerResolveLifetimeManager());
this.RegisterType<ISessionManager, SessionManager>(new PerResolveLifetimeManager());
Класс NhibernateRepository выглядит следующим образом с свойство сеанса
public NHibernateRepository(UserModel userModel, ISessionManager sessionManager)
{
UserModel = userModel;
SessionManager = sessionManager;
}
public ISession Session
{
get
{
using (_lock.WaitToRead())
{
if (_session != null) return _session;
}
using (_lock.WaitToWrite())
{
if (_session != null) return _session;
_session = SessionManager.GetSession(UserModel == null ? "Task" : UserModel.FullName);
return _session;
}
}
}
Класс Session Manager выглядит следующим образом:
public class SessionManager : ISessionManager
{
private static readonly ResourceLock _lock = new OneManyResourceLock();
public static ISessionFactory Factory { get; set; }
public ISession GetSession(string userName)
{
ISession session = GetSessionFactory().OpenSession(new AuditInterceptor(userName));
return session;
}
private static ISessionFactory GetSessionFactory()
{
using (_lock.WaitToRead())
{
if (Factory != null) return Factory;
}
using (_lock.WaitToWrite())
{
if (Factory != null) return Factory;
string connectionString = ConfigurationManager.ConnectionStrings["DomainConnection"].ConnectionString;
Factory = FluentlyConfigureFactory(connectionString, false);
return Factory;
}
}
private static ISessionFactory FluentlyConfigureFactory(string connectionString, bool showSql)
{
MsSqlConfiguration databaseConfiguration = MsSqlConfiguration.MsSql2005
.ConnectionString(c => c.Is(connectionString))
.Dialect<SparcMsSqlDialect>()
.UseOuterJoin()
.UseReflectionOptimizer();
if (showSql)
{
databaseConfiguration.ShowSql();
}
databaseConfiguration.Raw("generate_statistics", showSql.ToString());
FluentConfiguration configuration = Fluently.Configure().Database(databaseConfiguration);
return configuration
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<ApplicationMap>().Conventions.Add(typeof(Conventions)))
.ExposeConfiguration(
c => {
c.SetProperty("cache.provider_class", "NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache");
c.SetProperty("cache.use_second_level_cache", "true");
c.SetProperty("cache.use_query_cache", "true");
c.SetProperty("expiration", "86400");
})
.BuildSessionFactory();
}
Кто-нибудь видел ли что-то принципиально неправильно с этим? Из googling я вижу все разные мнения о том, как вы должны настроить asp.net-mvc с nhibernate (добавление транзакции в beginRequest и фиксация на endRequest и т. Д.), Но я не могу найти канонический способ заставить его работать с кэшированием второго уровня и т. Д. что, кажется, лучшая практика, имеющие высокую масштабируемость и т.д.
Я попробовал добавлять транзакции в этот код, указанный то, что я прочитал, но я, кажется, теперь будут получать эту ошибку:
Initializing[ (one of my domain objects) #1]-Could not initialize proxy - no Session.
, так что я вернулся, что код. В основном я надеюсь, что на данный момент существует «передовая практика» для использования любого кеша второго уровня, транзакций в asp.net-mvc. ,
Я смущен, почему вы напишете свою реализацию владельца, когда есть много, что существует o в коробке. Во всяком случае, я не уверен, что вы ответили на вопрос о том, как настроить репозиторий и sessionmanager – leora