Как вам нравится часть доступа к данным (с SQL Server) Agile Принципы, Шаблоны и Практики в C # - PullRequest
0 голосов
/ 30 августа 2009

Как вы относитесь к коду доступа к данным, например так:

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 является приемлемым.

Как вы думаете?

1 Ответ

0 голосов
/ 30 августа 2009

Код, подобный этому, не пахнет для меня хорошо.
Вы, вероятно, делаете свой собственный O / R-M, поэтому не знаете всех деталей.

Но использование интерфейсов может помочь (в этом случае сущность Payment будет иметь дело с кодом 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

Поэтому, когда вам нужно будет добавить другой тип платежа, вам нужно будет добавить для него персистор и зарегистрировать его.
Это выглядит намного лучше, чем оригинальный код для меня.

Приветствие.

...