ServiceStack和NHibernate工作单元模式

时间:2013-01-10 06:45:53

标签: nhibernate servicestack unit-of-work

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

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

尝试使用ServiceStack

完成类似的事情

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

我的问题是:

  1. 这是一个好主意,还是没有更好的方法 这与ServiceStack。
  2. 在MVC网站中,我们只创建一个新单元 我们应该如何处理将添加/更新/删除数据的操作 这里有类似的东西,或者只是为了检索数据而创建一个事务呢?

2 个答案:

答案 0 :(得分:3)

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也适用于全局请求/响应过滤器,它将获得与服务中使用的实例相同的实例。

答案 1 :(得分:0)

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

资源:

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

请参阅以下任何内容以获取解释原因:

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