David_Wimbley
Хорошо, основываясь на ваших комментариях, я думаю, что теперь понимаю.
Я думаю, что вам нужно заняться инъекцией зависимостей. Например, библиотека Ninject. Есть и другие, но я предпочитаю ninject.
Статья для начинающих: Абсолютный учебник для начинающих по принципу инверсии зависимостей, инверсии контроля и инъекции зависимостей[^]
Суть в том, что вы говорите. Ваш класс (MyWebServiceImpl) должен знать, что он получает класс журнала. Вместо того, что вы могли бы сделать, это создать интерфейс, который называется выйти из кратера и класс MyWebServiceImpl получите выйти из кратера в парам.
При этом ваш класс может использовать для ведения журнала любой класс, наследуемый от ILog. У вас может быть регистратор БД под названием DBLog, файловый регистратор под названием Log или консольный выходной регистратор под названием ConsoleLog, но пока класс наследуется от ILog, ваш MyWebServiceImpl не должен знать конкретный конкретный класс, который он использует.
Вы можете использовать ручную инъекцию зависимостей таким образом, как это
public interface ILog
{
void Log(string msg);
}
public class SqlLog : ILog
{
public void Log(string msg)
{
//Write to sql.
}
}
public class FileLog : ILog
{
public void Log(string msg)
{
//Write log to file
}
}
Тогда в вашем классе MyWebServiceImpl вы бы сделали что-то вроде
public class MyWebServiceImpl
{
private readonly ILog _log = null;
public MyWebServiceImpl(ILog logger)
{
this._log = logger;
}
}
Таким образом, ваш класс MyWebServiceImpl не зависит только от использования SqlLog или FileLog...it можно использовать и то, и другое. Использование было бы что-то вроде
ILog logger = new SqlLog();
var srv = new MyWebServiceImpl(logger);
//Then you can also do
ILog filelogger = new FileLog();
var srv1 = new MyWebServiceImpl(filelogger);
И не ваш класс не зависит ни от одного типа регистратора из-за ручного внедрения зависимостей, выполняемого с помощью ILog.
Однако я настоятельно рекомендую вам заглянуть в ninject.