Вы можете синхронно вызывать логику инициализации в конструкторе службы по умолчанию . Операции службы не будут вызываться до тех пор, пока не будет создан экземпляр службы, что произойдет только после завершения инициализации. Тем временем клиенты просто не получат ответ.
Вот краткий пример:
public class MyService : IMyService
{
public MyService()
{
// Blocking call that initializes
// the service instance
this.Initialize();
}
public void GetData()
{
// The service operation will be invoked
// after the service instance has been created
// at which point the initialization is complete
}
private void Initialize()
{
// Initialization logic
}
}
Если логика инициализации стоит дорого, вам следует рассмотреть возможность запуска службы как одиночной, чтобы цена оплачивалась только по первому запросу . В качестве альтернативы вы можете хранить данные, загруженные во время инициализации, в централизованном кэше. Таким образом, его можно сделать доступным для нескольких экземпляров службы, при этом его необходимо загрузить только один раз.
Если логика инициализации используется несколькими службами, вам следует рассмотреть возможность ее реализации один раз в пользовательском ServiceHost путем переопределения OnOpening метод. Поскольку вы размещаете свои службы в IIS, вам также потребуется реализовать пользовательский ServiceHostFactory для создания экземпляров вашего ServiceHost.
Подробнее об этом подходе вы можете прочитать в этой статье MSDN .