0

您如何看待这样的数据访问代码:

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”来检测类型来决定要做什么),但作者罗伯特马丁说这没关系,因为它只在 DAL 中,所以有点违反 OCP 是可以接受。

你怎么想?

4

1 回答 1

0

像这样的代码对我来说并不好闻。
您可能正在做自己的 O/RM,所以不知道所有细节。

但是使用接口可能会有所帮助(在这种情况下,支付实体将被 DAL 代码污染)...... 八字不香。

因此,类的注册可能会完成这项工作:

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

因此,当您需要添加另一种支付类型时,您必须为其实现持久化并注册它。
这看起来比我的原始代码好得多。

干杯。

于 2009-08-30T03:25:43.477 回答