Я предполагаю, что вы используете фабричный класс для того, чтобы:
- имел стандартный фасад, принимающий параметры, которые приводят к выбору бизнес-правил и инициализация
- инкапсулировать предоставление бизнес-правил
- отделить пользователей от реальных реализаций
IBusinessRules
Следовательно, я бы решил вашу проблему, введя новый интерфейс
interface IComputableRules : IBusinessRules
{
string Calculate();
}
Покаследуя дизайну на основе интерфейса, нет ничего плохого в приведении фактического экземпляра к интерфейсу, отличному от IBusinessRules
.
IBusinessRules businessRule = objFactory.GetObject(...some input...)
...
// check if the computable service is supported and print the result
IComputableRules computable = businessRule as IComputableRules;
if (computable)
{
Console.WriteLine(computable.Calculate());
}
. Здесь вы можете рассматривать свои классы бизнес-правил как поставщиков услуг, которые гарантируютнекоторые базовые услуги, а также дополнительные дополнительные услуги в зависимости от характера бизнес-правила.
Примечание. Превратив BusinessRulesFactory
в общий класс, вы можете сделать указание на конкретную услугу частью заводского контракта.и убедитесь, что возвращенная реализация бизнес-правила будет поддерживать определенный (в противном случае выберитеионный) сервис.
class BusinessRulesFactory<TService> where TService : IBusinessRules
{
public TService GetObject(int clientIdentityCode)
{
// ... choose business rule in respect to both clientIdentityCode and TService
}
}
В случае, если вам не требуется, чтобы какой-то конкретный дополнительный сервис был доступен, вы просто используете IBusinessRules
в качестве фактического параметра типа.