2

故事尽量简短...

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

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

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

我的问题是:

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

2 回答 2

3

正如ServiceStack 的 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

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

于 2013-01-11T05:05:35.540 回答
0

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

于 2013-01-10T23:17:37.083 回答