2009-08-30 4 views
0

어떻게이 같은 데이터 액세스 코드에 대한 생각 : 개인적으로는 C#에서 민첩한 원칙, 패턴, 및 관행 (SQL Server와) 데이터 액세스 부분처럼 당신을 어떻게

public void AddCusotmer(Cusotmer customer) 
{ 
    //save customer into database 
    ... 

    // save payment type 
    SavePaymentType(customer); 

    //save other data 
    ... 
} 

private void SavePaymentType(Customer customer) 
{ 
    if(customer.PaymentType is XXXPayment) 
    { 
     var payment = customer.PaymentType as XXXPayment; 
     //save payment to XXXPayments table in db 
     ... 
    } 
    else if(customer.PaymentType is YYYPayment) 
    { 
     var payment = customer.PaymentType as XXXPayment; 
     //save payment to YYYPayments table in db 
     ... 
    } 
    ... 
} 

, 나는 아니에요 이런 식으로 코드를 잘 사용하면 ("is"를 사용하여 무엇을 할 것인지 결정할 수 있습니다), 저자 인 Robert Martin은 DAL에서만 가능하므로 OCP를 약간 위반해도 괜찮습니다.

어떻게 생각하십니까?

답변

0

이 코드는 나에게 좋은 냄새가 아닙니다.
당신은 아마도 자신의 O/R-M을하고있을 것이므로 모든 세부 사항을 모른다.

하지만 인터페이스 사용이 도움이 될 수 있습니다 (이 경우 Payment 엔티티는 DAL 코드로 polutet됩니다) ... 좋은 냄새가 나지 않습니다.

그래서 아마 클래스의 등록은 작업 할 것 :

private void SavePaymentType(PaymentType) 
{ 
    if (paymentType == null) 
     throw new NotSupportedException("Handle nulls too"); 
    IClassPersister persister; 
    if (!paymentType2Persister.TryGetValue(paymentType.GetType(), out persister)) 
     throw new ORMException(string.Format("Cannot find persister for {0}", paymentType.GetType().Name)) 
    persister.Save(paymentType); 
} 

그리고 어딘가에 응용 프로그램이 시작되는 동안 당신이 PaymentTypes 등록 할 수 있습니다 : 당신이 다른 지불을 추가해야합니다 그래서

paymentType2Persister.Add(typeof(XXXPayment), new XXXPaymentPersistor); 
paymentType2Persister.Add(typeof(YYYPayment), new YYYPaymentPersistor); 
// etc 

을 당신은 그것에 대한 persistor을 구현하고 그것을 등록해야합니다 입력합니다.
원본 코드가 훨씬 나을 것 같습니다.

건배.

+0

그래, 나도 당신의 해결책에 더 기분이 좋습니다. – deerchao