PersonReaderFromFile
не зависит от Person
. Этот класс выглядит просто как POCO, который представляет данные времени выполнения.
PersonReaderFromFile
зависит от StreamReader
вместе с ParseInformationFromLine
функцией
Сначала абстрагируйте эти детали реализации в свои собственные проблемы.
public interface IReadLines {
string ReadLine();
}
public interface IParsePersonInformationFromLine {
void ParseInformationFromLine(string line, out string name, out string lastName, out string email);
}
Целевой класс будет явно зависеть от абстракций
public class PersonReaderFromFile {
private readonly IReadLines reader;
private readonly IParsePersonInformationFromLine parser;
public PersonReaderFromFile(IReadLines reader, IParsePersonInformationFromLine parser) {
this.reader = reader;
this.parser = parser;
}
public Person GetNext() {
string line = reader.ReadLine();
if (line == null) {
return null;
}
string name, lastName, email;
parser.ParseInformationFromLine(line, out name, out lastName, out email);
Person p = new Person { Name = name, LastName = lastName, Email = email };
return p;
}
}
Отдельные абстракции будут иметь свои собственные реализации для удовлетворения желаемой функциональности, которая будет использоваться во время выполнения. Например, читатель внутренне все еще будет использовать StreamReader
для получения строк. PersonReaderFromFile
не нужно ничего знать о том, как извлекается строка. Только то, что ему нужна строка при вызове.
Main
теперь можно реорганизовать для использования Pure DI, например
static void Main() {
IReadLines reader = new ReadLinesImplementation("path-to-file");
IParsePersonInformationFromLine parser = new ParsePersonInformationFromLine();
PersonReaderFromFile personReader = new PersonReaderFromFile(reader, parser);
Person p = personReader.GetNext(); //return a Person parsed from file line or NULL at EOF
}
Существуют и другие рефакторы, которые можно применять, но это только означает быть упрощенным примером определения деталей реализации, которые следует абстрагировать от кода, тесно связанного с проблемами реализации.