Nano Hash - криптовалюты, майнинг, программирование

Сессия ServiceStack NHibernate на запрос

Я начинаю создавать приложение и планирую использовать ServiceStack. Просто хочу знать, каковы лучшие практики / хорошие подходы для обработки NHibernate ISession или других объектов сеанса, специфичных для контекста запроса.

Я думал, что зарегистрировать ISessionFactory в Ioc, например:

container.Register<ISessionFactory>(sessionFactory);

И при необходимости получить новый объект сеанса ... Или, может быть, напрямую предоставить объект сеанса:

container.Register<ISession>(c => sessionFactory.OpenSession()).ReusedWithin(ReuseScope.None);

Либо обработайте ISession и транзакцию по умолчанию через событие Global.asax BeginRequest:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    var session = factory.OpenSession();
    ITransaction itrans = session.BeginTransaction();
    Context.Items.Add("session", session);
    Context.Items.Add("trans", itrans);
}

Итак, я немного запутался, каковы лучшие практики с учетом вышеуказанных технологий или аналогичных, таких как EF или другой фреймворк Rest-Services?

заранее спасибо

06.07.2012

Ответы:


1

См. Это сообщение в блоге для получения полного примера того, как оптимально использовать ServiceStack и NHibernate вместе:

http://www.philliphaydon.com/2012/06/using-nhibernate-with-servicestack/ Вот пример AppHost, использованный в сообщении выше:

public class Global : HttpApplication
{
    public class SampleServiceAppHost : AppHostBase
    {
        private readonly IContainerAdapter _containerAdapter;
        public SampleServiceAppHost(ISessionFactory sessionFactory)
            : base("Service Stack with Fluent NHibernate Sample", typeof(ProductFindService).Assembly)
        {
            base.Container.Register<ISessionFactory>(sessionFactory);
        }

        public override void Configure(Funq.Container container)
        {
            container.Adapter = _containerAdapter;
        }
    }

    void Application_Start(object sender, EventArgs e)
    {
        var factory = new SessionFactoryManager().CreateSessionFactory();

        (new SampleServiceAppHost(factory)).Init();
    }
}
06.07.2012

2

Создание сеанса для каждого запроса с использованием HttpHandler - это наиболее распространенный способ, который я нашел. Айенде объяснила, что создание сеанса действительно легкое дело. http://ayende.com/blog/4123/what-is-the-cost-of-opening-a-session

На самом деле у Айенде есть серия постов, в которых он постепенно создает решение для доступа к данным. В каждом посте объясняется, почему он сделал то, что он сделал, и какие проблемы необходимо решить с помощью предпринятых шагов. Начните здесь: http://ayende.com/blog/4803/refactoring-toward-frictionless-odorless-code-the-baseline

Наконец, http://nhforge.org/blogs/nhibernate/archive/2011/03/03/effective-nhibernate-session-management-for-web-apps.aspx

Все вышеперечисленное является вариациями сеанса на запрос. Общим для всех является отсутствие необходимости вручную беспокоиться о создании сеанса / транзакции. Они будут автоматически фиксировать / откатывать транзакции.

06.07.2012

3

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

Мы используем ServiceRunner в новом ServiceStack API следующим образом:

public class BaseServiceRunner<TRequest> : ServiceRunner<TRequest>
{
    public BaseServiceRunner(AppHost appHost, ActionContext actionContext)
    : base(appHost, actionContext) { }

    public override void OnBeforeExecute(IRequestContext requestContext, TRequest request)
    {
        var req = request as MyRequestType;

        if(req == null)
            base.OnBeforeExecute(requestContext, request);

        var factory = TryResolve<NHibernate.ISessionFactory>();
        var session = factory.OpenSession();
        var trans = session.BeginTransaction(IsolationLevel.ReadCommitted);

        requestContext.SetItem("session", session);
        requestContext.SetItem("transaction", trans);
    }        

    public override object OnAfterExecute(IRequestContext requestContext, object response)
    {
        var trans = requestContext.GetItem("transaction") as ITransaction;
        if (trans != null && trans.IsActive)
            trans.Commit();

        var session = requestContext.GetItem("session") as ISession;
        if (session != null)
        {
            session.Flush();
            session.Close();
        }

        return base.OnAfterExecute(requestContext, response);
    }

    public override object HandleException(IRequestContext requestContext, TRequest request, Exception ex)
    {
        var req = request as MyRequestType;
        if(req != null)
        {
            var trans = requestContext.GetItem("transaction") as ITransaction;
            if (trans != null && trans.IsActive)
                trans.Rollback();

            var session = requestContext.GetItem("session") as ISession;
            if (session != null)
            {
                session.Flush();
                session.Close();
            }
        }
        return base.HandleException(requestContext, request, ex);
    }        
}   
20.03.2013
  • Не могли бы вы рассказать, как вы это использовали? Документация ServiceStack действительно не имеет смысла относительно того, как использовать эти ServiceRunner .. 17.04.2013
  • Я добавил код для добавления в ваш хост приложения. Не уверен, как использовать Service runner из службы. 15.07.2013
  • Только что просмотрел запросы на дополнительную информацию, может быть слишком поздно, чтобы быть полезным, но, возможно, кто-то еще хочет знать. code общедоступный класс AppHost: AppHostBase {public AppHost (): base (Service, typeof (AccessService) .Assembly) {} public override void Configure (Container container) {} public override IServiceRunner ‹TRequest› CreateServiceRunner ‹TRequest› (ActionContext actionContext) { вернуть новый BaseServiceRunner ‹TRequest› (this, actionContext); } code 08.02.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..