Мне было интересно, каковы некоторые из лучших практик в отношении каркасов и каркасов и внедрения зависимостей. В частности, если я разрабатываю класс, которому требуется способ ведения журнала, как мне получить интерфейс для ведения журнала, чтобы иметь в виду внедрение зависимостей?
Внедрение зависимостей, кажется, утверждает, что внешние зависимости должны быть внедрены извне (конструкторы или установщики свойств), поэтому я должен взять экземпляр ILog в конструкторе и использовать в классе? Я должен рассмотреть регистрацию дополнительной зависимости и получить ее в сеттере? Я настаиваю на слишком большой гибкости, допуская изменение интерфейса ведения журнала, и я должен просто взять жесткую зависимость от конкретного интерфейса ведения журнала (например, создать статическую переменную ILog через вызов метода фабрики)? Может ли этот метод фабрики вызвать в контейнер, чтобы получить реализацию ILog, или это создаст конфликт инициализации между статическими переменными, которые инициализируются, и контейнером IoC, который инициализируется?
Должен ли я делать это:
public class MyService : ISomeService
{
private static readonly ILogger s_log =
LoggingFactory.GetLogger(typeof(MyService))
...
}
или, возможно, это:
public class MyService : ISomeService
{
protected virtual ILogger Logger {get; private set;}
public MyService(ILogger logger, [other dependencies])
{
Logger = logger;
}
}
или даже это:
public class MyService : ISomeService
{
public virtual ILogger Logger {get; set;}
public MyService()
{
}
}
Другие модели или способы сделать это? Что люди там делают? Что работает и когда?