我有以下测试代码:
try
{
Product product = productService.GetProductById(1502);
product.ProductName = "TEST PRODUCT NAME";
throw new ArgumentException("");
//Do some other DB updates
//Call SaveChanges
productService.SaveChanges();
}
catch(Exception ex)
{
logService.InsertLog(LogTypeEnum.Error, "test", ex);
logService.SaveChanges();
}问题是我的服务每个请求共享一个上下文(使用StructureMaps HttpContextScoped)。因此,当故障发生时--我称之为logService.SaveChanges --它保存了产品的新名称。但是,我失去了原子性,因为“其他DB更新”不会保存到DB中。实现这一点的正确方法是什么?
发布于 2016-01-12 08:31:33
这总是每个请求的上下文都会出现问题。在一个大型项目中,我也是从每个请求的上下文开始的,但是由于这样的问题,我已经逐渐删除了它。
我建议在这样的场景中,您可能需要在不调用SaveChanges的情况下写到您的DB --如果所有这些都局限于这个日志服务,那么也许您应该在不依赖上下文的情况下重新实现它?或者,您应该能够指定使用自己的上下文创建日志服务的自定义方法(即不只是构造函数注入一个日志服务)。
我不熟悉结构映射语法,所以这里有一些来自Autofac的东西,可以做同样的事情.
builder.RegisterType<MyContext>().InstancePerRequest(); // As you have already
builder
.Register(c => new LogService(new MyContext())
.As<ILogService>().InstancePerRequest();这将使用显式创建的上下文来构造LogService,而不是使用如果我正常注册就会注入的每个请求实例。
https://stackoverflow.com/questions/34736924
复制相似问题