2013-10-04 3 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를 사용하거나 새 UnitOfWork를 시작할 수 있습니다. –

+0

어떻게 전달할 수 있습니까? 매개 변수 - 속성? – GorillaApe