2013-01-21 2 views
1

이전에는 대리인을 사용 했으므로 사용법과 이점에 대해 잘 알고 있습니다. 나는 또한 많은 독서/연구를 해왔지만이 문제를 해결하고 아무데도 쓰려고 노력하고 있습니다. 대리자를 사용하여 일부 코드를 캡슐화하거나 메서드 내에서 대리자를 사용하여 일부 외부 코드를 호출하고 싶습니다.C# 대리자/메서드에 대한 설명

트랜잭션에서 엔티티 프레임 워크 업데이트를 래핑하기 위해 20 개 장소에서 동일한 코드를 사용하고 있습니다. 한 곳에서 코드를 원합니다. 그러나 매번 변경 될 중간 부분이 있기 때문에 자체적으로 메소드에서 수행 할 수는 없습니다. 나는 몇 가지 아이디어를 찾고 있는데/내가 이것을 가장 잘 할 수있는 방법에 대한 설명이다. (.net 3.5, ms sql 2010). - thnx

코드 샘플 : 당신은 기능 위임 (또는 람다)를 통과

void AddItem(string objDetails) 
    { 
     // setup method specific entity objects 
     SomeObject obj = new SomeObject { Details = objDetails }; 


     //////// Begin transaction code that I would like to encapsulate /////// 
     bool success = false; 

     using (Entities data = new Entities()) 
     { 
      for (int i = 0; i < s.BaseSettings.CommandRetries; i++) 
      { 
       using (TransactionScope transaction = new TransactionScope()) 
       { 
        try 
        { 
         ////////////////////////////////////////////////////////////// 
      ///////// BEGIN Code that I would like to change/call different each time //////// 

      data.AddToSOMEOBJECTs(obj); 

      //////////////// END ////////////////////////////////// 


      //// RETURN TO ENCAPSULATED CODE //// 

         data.SaveChanges(false); 
         transaction.Complete(); 
         success = true; 
         break; 
        } 
        catch (Exception ex) 
        { 
         if (ex.GetType() != typeof(UpdateException)) 
         { 
          throw new Exception("Unhandled db exception."); 
         } 
        } 
       } 
      } 
      if (success) 
      { 
       data.AcceptAllChanges(); 
      } 
      else 
      { 
       throw new Exception(); 
      } 
     } 
    } 
+0

내가 장님이 될 수는 있지만, 어디'A'입니다 한정된? – Prescott

+0

변경하고 싶은 부분에서도, 그 밖에 무엇이 좋을지를 보여줄 수 있습니까? – Prescott

+0

내가 변경하고 싶은 부분은 항상 프레임 워크의 일부 테이블을 업데이트합니다. 그러나 테이블은 업데이트되는 내용에 따라 매번 변경됩니다. 나는 코드 레퍼런스를 고쳤다. 기본적으로 트랜잭션은 업데이트 (매번 변경해야하는)를 래핑하는 것입니다. – Adam

답변

1

사용자 정의 비트이 아마 같은이

void AddItem<T>(string objDetails, Func<T> custom) { 
    . 
    . common 
    . 
    . 
    T someReturn = custom(); 
    . 
    . common 
    . 
} 

추가 호출 같은

을 수행합니다

Func<int> custom =() => { 
    // do something custom 
    return 9; 
} 

// Call common function  
AddItem<int>(..., custom); 

중요한 것은 Func의 인터페이스가 필요한 것과 일치한다는 것입니다.

+0

감사합니다. 나는 올바른 생각 과정을 가졌지 만,이 구문을 사용하지 않았기 때문에 약간 놀아야 할 것입니다. – Adam

0

대리인과 이벤트를 사용하여 다른 메서드를 전달할 수 있습니다.

class SampleClass 
{ 
    public delegate void TransactionDelegate(); 
    public event TransactionDelegate MyTransactionDelegate; 

    public void DoSomething() 
    { 
     MyTransactionDelegate(); 
    } 

} 

당신은 다음과 같은 이벤트에 방법을 전달하는 람다 식을 사용할 수 있습니다 : 여기이 수행하는 클래스의 예

class MainClass 
{ 
    public static void Main (string[] args) 
    { 
     var test = new SampleClass(); 
     test.MyTransactionDelegate +=() => {Console.WriteLine("Success");}; 
     test.DoSomething(); 
    } 
}