Re[2]: Фабрика объектов с разными конструкторами
От: licedey  
Дата: 08.11.16 08:43
Оценка:
Здравствуйте, ·, Вы писали:

·>Здравствуйте, licedey, Вы писали:


L>>Задача: реализовать IPaymentProcessor

·>Я бы как-то так сделал:

·>
·> public interface IBusinessRule
·> {
·>        bool Validate();
·> }

·> class Rule1 : IBusinessRule
·> {
·>      public Rule1(string name) { ... }
·>      bool Validate() { ... }
·> }

·> class Rule2 : IBusinessRule
·> {
·>      public Rule1(int month, int year) { ... }
·>      bool Validate() { ... }
·> }

·> class CompositeBusinessRule : IBusinessRule
·> {
·>      const IBusinessRule rules;
·>      CompositeBusinessRule(IBusinessRule rules...) {this.rules = rules;}
·>      bool Validate() {
·>           foreach(var r in rules) if(!r.Validate()) { return false; }
·>           return true;
·>      }
·> }

·> interface IPaymentProcessor
·> {
·>    bool MakePayment(CreditCard card);
·> }

·> class CreditCardValidatorFactory
·> {
·>    IBusinessRule createValidation(CreditCard card)
·>        {
·>           return new CompositeBusinessRule(
·>                 new Rule1(card.Name),
·>                 new Rule2(card.Month, card.Year)
·>           );
·>        }
·> }

·> interface IPaymentProcessor
·> {
·>    bool MakePayment(CreditCard card);
·> }

·> class MyPaymentProcess : IPaymentProcessor
·> {
·>    const CreditCardValidatorFactory validatorFactory;
·>        MyPaymentProcess(CreditCardValidatorFactory validatorFactory) { this.validatorFactory = validatorFactory;}

·>    public bool MakePayment(CreditCard card)
·>     {
·>        IBusinessRule validator = validatorFactory.createValidation(card);
·>        if(!validator.Validate()) { return false; }
·>        return true;
·>    }
·> }  

·>

·>А следующим шагом я бы изменил IBusinessRule чтобы они ещё репортили ошибку c подробностями что случилось, а не просто true/false.

Мое решение похоже, только одним классом RulesFactory, не плодя сущности. С методом
Register(Func<CreditCard, IRule> newRuleCreator) { _listOfRules.Add(newRuleCreator); }

Ну и далее в конструкторе фабрики регистрируем все нужные инстансы IRule, и в случае чего в рантайме тоже вызываем Register для новых правил.

·>ЗЫЖ Ninject — фтопку, как и все IoC-фреймворки.

С этого места по подробнее пожалуйста. Это чуть ли не первый вопрос на каждом интервью. Рассказать про DI. А с ним и про Ninject.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.