首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ServiceStack和NHibernate工作模式单元

ServiceStack和NHibernate工作模式单元
EN

Stack Overflow用户
提问于 2013-01-10 06:45:52
回答 2查看 876关注 0票数 2

长话短说。

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

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

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

我的问题是:

  1. 这是一个好主意还是不好的主意,或者是否有更好的方法来使用ServiceStack。
  2. 在MVC站点中,我们只创建一个新的操作单元,该操作将添加/更新/删除数据--我们应该在这里执行类似的操作,还是只创建一个事务来检索数据?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-11 05:05:35

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

代码语言:javascript
复制
container.RegisterAutoWiredAs<NHibernateUnitOfWork, IUnitOfWork()
    .ReusedWithin(ReuseScope.Request);

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

代码语言:javascript
复制
container.Register<ISession>((c) => {
    var uow = (INHibernateUnitOfWork) c.Resolve<IUnitOfWork>();
    return uow.Session;
});

你可能想做这个:

代码语言:javascript
复制
    .ReusedWithin(ReuseScope.Request); //per request

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

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

票数 3
EN

Stack Overflow用户

发布于 2013-01-10 23:17:37

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

资源:

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

关于原因的解释,请参阅下列任何一项:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14252251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档