2013-10-04 204 views
0

我从https://stackoverflow.com/a/14988549/294022偷了下面的代码。业务逻辑层的交易

这似乎是一个很好的抽象。但是有一个问题。如果你想结合多个服务呼叫怎么办?

这可以很好地结合DAL调用。但为了服务?有解决方案吗?

public class Foo //POCO for data access 
    { 
     //Add Attributes for Ormlite 
     public int Id { get; set; } 
    } 

    public class Bar //POCO for data access 
    { 
     //Add Attributes for Ormlite 
     public int Id { get; set; } 
    } 

    //your request class which is passed to your service 
    public class DeleteById 
    { 
     public int Id { get; set; } 
    } 

    public class FooBarService : MyServiceBase //MyServiceBase has resusable method for handling transactions. 
    { 
     public object Post(DeleteById request) 
     { 
      DbExec(dbConn => 
         { 
          dbConn.DeleteById<Foo>(request.Id); 
          dbConn.DeleteById<Bar>(request.Id); 
         }); 

      return null; 
     } 
    } 

    public class MyServiceBase : Service 
    { 
     public IDbConnectionFactory DbFactory { get; set; } 

     protected void DbExec(Action<IDbConnection> actions) 
     { 
      using (var dbConn = DbFactory.OpenDbConnection()) 
      { 
       using (var trans = dbConn.OpenTransaction()) 
       { 
        try 
        { 
         actions(dbConn); 
         trans.Commit(); 
        } 
        catch (Exception ex) 
        { 
         trans.Rollback(); 
         throw ex; 
        } 
       } 
      } 
     } 
    } 

回答

0

我认为你需要去朝实施的UnitOfWork可以传递/在那些谁愿意在一个单一的“交易”,以分享分享。

+0

我知道这个,但如何? – GorillaApe

+0

创建一个表示UnitOfWork的接口,然后创建一个MsSql特定的实现。让你的服务类依赖于接口,然后你可以传递实现。这样你的服务可以使用当前的UnitOfWork或者开始一个新的,等等。 –

+0

它怎么传递?参数 - 属性? – GorillaApe