每个请求的ServiceStack NHibernate会话

RMa*_*lke 8 nhibernate servicestack

我开始构建一个应用程序,我打算使用ServiceStack.只是想知道处理NHibernate ISession的最佳实践/好方法是什么,或者其他"每个请求"特定于上下文的会话对象.

我想在Ioc中注册一个ISessionFactory,如:

container.Register<ISessionFactory>(sessionFactory);
Run Code Online (Sandbox Code Playgroud)

并在需要时获取一个新的Session对象......或者可以直接提供会话对象:

container.Register<ISession>(c => sessionFactory.OpenSession()).ReusedWithin(ReuseScope.None);
Run Code Online (Sandbox Code Playgroud)

或者通过Global.asax BeginRequest事件处理ISession和默认事务:

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);
}
Run Code Online (Sandbox Code Playgroud)

所以,我有点迷茫,在上述技术或类似的技术(如EF或其他Rest-Services框架)下,最佳实践是什么?

提前致谢

myt*_*thz 3

请参阅这篇博客文章,了解如何最佳地结合使用 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();
    }
}
Run Code Online (Sandbox Code Playgroud)