Есть интерфейс и несколько производных классов которые реализуют метод Validate. В довесок к нему, существует интерейс IPaymentProcessor,
которы применяет все правила, т.е. создает объект и вызвает метод Validate() у Rule1, Rule2, итд.
Задача: реализовать 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() { ... }
}
interface IPaymentProcessor
{
bool MakePayment(CreditCard card);
}
class MyPaymentProcess : IPaymentProcessor
{
public bool MakePayment(CreditCard card)
{
// Вот тут засада. Если нам нужно добавить/удбрать правило, меняется конструктор итд.,
// То надо лезть в этот код. Что совсем не правильно.
var rules = new List<IBusinessRule>() { new Rule1(card.Name), new Rule2(card.Month, card.Year) };
foreach(var r in rules) if(!r.Validate()) { return false; }
return true;
}
}
Вопрос: как заменить создание списка на лету, какой-нибудь фабрикой или контейнером, чтобы уменьшить связность? Желательно из готовых решений под .NET, еще лучше через Ninject (так в требованиях).
Копая в сторону Ninject/DI, натыкался на проблему: либо непонятно как разное кол-во параметров в конструкторе,
либо непонятно в по какому принципу делать ninjectKernel.Get, или в нашем случае что-то вроде GetAll, для перечисления.