【发布时间】:2014-03-02 01:00:18
【问题描述】:
我想问问你我的想法是否行得通。
我最近开始使用实体框架和 WCF。在我当前的项目中,我希望每个服务都是原子的,也就是说一个服务在一个事务中。但我不想为所有服务操作多次编写相同的事务相关代码。然后我想到了事务及其错误处理在一个地方完成IOperationInvoker 就像下面显示的代码 sn-p 一样。
这个技巧的优点是我可以实例化DbContext 或在使用块中创建事务,这样无论服务中发生什么,它们都会被处理掉。而且我只需要处理一次与数据库相关的异常。
它似乎工作。但我担心这是否是使用 IOperationInvoker 和 EF 的合法方式。
有什么缺点吗?
// service base class
public abstract MyBaseService
{
DbContext database {get; set;}
}
[ServiceContract]
public interface IMyService {...}
// concrete service class
public class MyService : MyBaseService, IMyService {...}
public class MyOperationInvoker : IOperationInvoker
{
IOperationInvoker originalOperationInvoker; // to be set at construction
public object Invoke(object instance, object[] inputs, out object[] outputs)
{
using (var dbContext = new MyDbContext())
{
// inject DbContext into my service to be used in it.
(MyServiceBase)instance.database = dbContext;
// invoke a service within db transaction.
using (var transaction = dbContext.Database.BeginTransaction())
{
try
{
objct ret = originalOperationInvoker.invoke(instance, inputs, outputs);
transaction.Commit();
return ret;
}
catch (Exception e)
{
transaction.Rollback();
throw;
}
}
}
}
...
}
【问题讨论】:
-
我认为codereview 是解决这个问题的更好地方。需要注意的是,
IOperationInvoker的最大缺点是它可以与objects 一起使用。有一些方法可以使其类型更强大,有时称为“中间孔”模式,stackoverflow.com/q/5254881/861716。
标签: c# wcf entity-framework