【问题标题】:ServiceStack and NHibernate Unit Of Work PatternServiceStack 和 NHibernate 工作单元模式
【发布时间】:2013-01-10 06:45:52
【问题描述】:

故事尽可能简短......

我有一个现有的应用程序,我正在尝试让 ServiceStack 进入以创建我们的新 API。此应用目前是 MVC3 应用,并使用 UnitOfWork 模式在 MVC 路由上使用属性注入来创建/完成应用属性的事务。

尝试使用 ServiceStack 完成类似的事情

This gist 显示相关的 ServiceStack 配置设置。我很好奇的是全局请求/响应过滤器——这些过滤器将为每个请求创建一个新的工作单元,并在将响应发送给客户端之前关闭它(那里有一个检查,所以如果发生错误写入db,我们向客户端返回适当的响应,而不是错误的“成功”消息)

我的问题是:

  1. 这是个好主意,还是有更好的方法 使用 ServiceStack。
  2. 在 MVC 站点中我们只创建一个新单元 将添加/更新/删除数据的操作的工作量 - 我们应该做 这里有类似的东西,还是只创建一个事务来检索数据就可以了?

【问题讨论】:

    标签: nhibernate servicestack unit-of-work


    【解决方案1】:

    正如ServiceStack's IOC wiki 中提到的,Funq IOC 默认将依赖项注册为单例。因此,要将其注册到 RequestScope,您需要在此处指定它:

    container.RegisterAutoWiredAs<NHibernateUnitOfWork, IUnitOfWork()
        .ReusedWithin(ReuseScope.Request);
    

    虽然这可能不是您想要的,因为它注册为单例,即为每个请求返回相同的实例:

    container.Register<ISession>((c) => {
        var uow = (INHibernateUnitOfWork) c.Resolve<IUnitOfWork>();
        return uow.Session;
    });
    

    你可能想做这个:

        .ReusedWithin(ReuseScope.Request); //per request
    
        .ReusedWithin(ReuseScope.None); //Executed each time its injected
    

    使用RequestScope 也适用于全局请求/响应过滤器,它将获得与服务中使用的相同的实例。

    【讨论】:

    • 谢谢!我想我听到的是“我很高兴在请求/响应过滤器中创建/提交 UOW。我的 NHibernateUnitOfWork 是一个使用会话(注入)的单例,只要会话设置为请求范围(它是)工作单元将通过代理 - 但我想添加reusedwithin(request)不会有什么坏处。再次感谢!
    【解决方案2】:

    1) 无论您使用的是 ServiceStack、MVC、WCF、Nancy 还是任何其他 Web 框架,最常用的方法是 session-per-request 模式。在 Web 术语中,这意味着在请求开始时创建一个新的工作单元,并在请求结束时处理该工作单元。几乎所有的 Web 框架都有这些事件的钩子。

    资源:

    2)您应该始终在事务中与 NHibernate 交互。

    请参阅以下任何内容以了解原因:

    请注意,当切换到使用带读取的事务时,请务必注意 NULL 行为:http://www.zvolkov.com/clog/2009/07/09/why-nhibernate-updates-db-on-commit-of-read-only-transaction/#comments

    【讨论】:

    • 谢谢,我知道 NHibernate 的工作单元模式和每个请求的会话的好处,我已经在我链接的 GIST 中进行了设置。我的问题更多的是我在请求中启动和提交事务的方式是否合适(使用全局请求/响应过滤器)。我没有看到任何问题,因为我确实将会话范围限定为请求,但我不确定可能发生的任何权衡......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    相关资源
    最近更新 更多