长篇故事尽可能简短......
我有一个现有的应用程序,我正在尝试使用ServiceStack来创建我们的新API。此应用程序当前是一个MVC3应用程序,并使用在MVC路由上使用属性注入的UnitOfWork模式来创建/完成应用该属性的事务。
尝试使用ServiceStack
完成类似的事情This gist 显示相关的ServiceStack配置设置。我很好奇的是全局请求/响应过滤器 - 这些将为每个请求创建一个新的工作单元并在将响应发送到客户端之前关闭它(有一个检查,所以如果发生错误写入db,我们向客户端返回一个适当的响应,而不是错误的“成功”消息)
我的问题是:
答案 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