Могу ли я предположить, что проблема заключается в дизайне вашего интерфейса, а ваш вопрос - в запахе?
IFileLogger
представляет интерфейс, от которого зависит ваш класс. Таким образом, глядя на интерфейс, мы видим, что существует метод Write
. Дело в том, что MyClass
на самом деле не волнует, как происходит регистрация, только то, что она соответствует интерфейсу. С учетом сказанного, мысль о том, что MyClass
необходимо знать местоположение каталога, чтобы сообщить IFileLogger
, как выполнять свою работу, говорит о том, что ответственность неуместна.
Какой код нужен IFileLogger
? Вход, верно? Давайте немного переработаем код и реализуем интерфейс для нужд клиента, MyClass
. Ему все равно, как происходит регистрация, просто что произойдет .
Вместо этого переименуйте интерфейс на ILogger
.
public MyClass : IClass
{
private ILogger Logger;
public MyClass(ILogger Logger)
{
this.Logger = Logger;
}
}
Теперь, когда в этом классе нет ссылок на «Файл», становится более очевидным, что параметр каталога здесь не принадлежит. Куда это относится? Вероятно, в самом FileLogger
.
Использование Dependency Injection позволит вам получить что-то вроде:
main() {
// Poor man's DI, no frameworks here
var logger = new FileLogger("some/directory");
var instance = new MyClass(logger);
return instance.DoSomethingUsefulThatEventuallyGetsLogged();
}
Надеюсь, это поможет!
Brandon