AlessandroF73 Ответов: 1

Как я могу внедрить некоторое внешнее поведение в объект, созданный через webservicehost?


var _webService = New WebServiceHost(GetType(MyWebServiceImpl), New Uri("http://localhost:8000"));


Что я уже пробовал:

Мне нужно ввести соединение с БД и регистратор в объект класса MyWebServiceImpl, но у меня нет ссылки на него, потому что этот объект создается конструктором WebServiceHost.

Как я могу получить ссылку на объект MyWebServiceImpl? Или есть какой-то шаблон, который я могу использовать, чтобы получить его?

Спасибо

David_Wimbley

Есть ли у вас доступ к источнику MyWebServiceImpl? Почему бы просто не изменить его, чтобы получить то, что вам нужно.

AlessandroF73

Вот что я сделал, чтобы обойти эту проблему. Но таким образом объект MyWebServiceImpl должен знать какой-то внешний класс, и я хотел бы избежать этого. Спасибо

1 Ответов

Рейтинг:
11

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.