Здравствуйте, ·, Вы писали:
·>Здравствуйте, 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.