У нас есть много длительных процессов, каждый из которых требует десятков шагов. Каждый шаг сам по себе является относительно сложным, поэтому мы разбили его на свои классы. Мы используем DI / IoC (StructureMap), чтобы помочь нам сделать все это тестируемым. Это прекрасно работает, но мы обнаруживаем кучу зависимостей в наших управляющих классах.
Например, одна из наших больших подпрограмм обрабатывает загрузку файла клиента 401k. Это имеет почти 70 отдельных шагов. Каждая логическая группа шагов имеет свой собственный класс, всего 14. Каждый из них довольно маленький и управляемый, но класс, который организует весь процесс, имеет массу зависимостей (то есть у нас есть группа классов Бога):
public Client401kProcessor (IValidator uploadValidator,
IGeneralLedgerExporter glExporter,
IDataMapper dataMapper,
IFinanceRepository financeRep,
//...9 more
IClientFileAuditor auditor)
{
_uploadValidator = uploadValidator;
//... etc
}
Этот конкретный класс имеет только пару открытых функций, что делает его очень простым в использовании:
public void ProcessClientFile(Guid savedFileId)
{
var clientUpload = _financeRep.FetchClientFile(savedFileId);
_uploadValidator.Validate(clientUpload);
_dataMapper.MapToStagedArea(clientUpload);
_dataMapper.FlagAsStaged(clientUpload.Id);
//...
_auditor.RecordChanges(client.Id);
}
Я чувствую, что мы должны что-то упустить. Тестировать, понимать и писать приведенный выше код довольно просто ... но люди .NET говорят нам, что у нас слишком много зависимостей. Как бы мы сократили эти зависимости и в то же время сделали код легким для тестирования / сопровождения?