2015-03-04 2 views
0

У меня есть служба WCF, работающая как служба Windows, и мне нужно запустить метод службы WCF при запуске службы Windows. Возможно ли это каким-либо образом?Запуск метода службы WCF во время запуска службы Windows

[ServiceContract] 
public interface IWebMonitorServiceLibrary 
{ 
    [OperationContract] 
    void TestMethod(); 
} 

[ServiceBehavior(IncludeExceptionDetailInFaults = true)] 
public class WebMonitorServiceLibrary : IWebMonitorServiceLibrary 
{ 
    #region properties 
    #endregion 


    #region events 
    #endregion 


    public WebMonitorServiceLibrary() 
    { 
     Initialization(); 
    } 

    private void Initialization() 
    { 
     ///////// 
    } 


    public void TestMethod() 
    { 
     ////////// 
    } 

} 
+0

Вы можете сообщить об этом в ваш сервис. –

+0

Что ты имеешь в виду? WCF или Windows Service? – petrppe

+0

Служба WCF ServiceContract и реализация сервиса –

ответ

1

Вы не объясните, почему вы хотите этот код инициализации для запуска, но дал вам почти никогда не хотите использовать службу WCF одного экземпляра, надлежащим образом будет использовать инъекции зависимостей (см How do I pass values to the constructor on my wcf service?).

Создайте объект, в котором вы храните вещи, которые вы хотите инициализировать, которые вы инициализацию на вашей службе Windows запускаются:

public class SomeSettingsYouWantToInitialize 
{ 
    public string SomeSetting { get; set; } 
} 

public class WindowsServiceInstance : ServiceBase 
{ 
    protected override void OnStart(string[] args) 
    { 
     InitializeWcfService(); 
    } 

    private void InitializeWcfService() 
    { 
     var settings = new SomeSettingsYouWantToInitialize 
     { 
      SomeSetting = "Foo" 
     }; 

     _yourDependencyContainer.Register<SomeSettingsYouWantToInitialize>(settings);  
    } 
} 

Тогда (используя любую зависимость рамки инъекции вы используете), инъекционную, что в свои службах строительный проект:

public class WebMonitorServiceLibrary 
{ 
    public WebMonitorServiceLibrary(SomeSettingsYouWantToInitialize settings) 
    { 
     // do stuff with settings 
    } 
} 
1

Как правило, нет. Это связано с тем, что по умолчанию (и в соответствии с наилучшей практикой) вы настроили свою службу для запуска за один вызов (или за сеанс), что означает, что на вашем хосте службы может быть несколько экземпляров вашей фактической службы.

Таким образом, любое требование для вас, чтобы иметь возможность вернуть экземпляр услуги с хоста службы, будет содержать некоторые неприятные сантехнические коды и не рекомендуется.

В частности, однако, есть два подхода, которые вы могли бы использовать, чтобы делать то, что хотите.

Первый включает запуск службы в экземпляре InstanceContextMode.Single - это означает, что будет один экземпляр службы, который будет обрабатывать все запросы. Если вы сделаете это, то вы можете просто создать экземпляр службы, а затем передать его в ServiceHost при запуске службы Windows:

var service = new MyService(); 
var host = new ServiceHost(service); 

Затем вы имеете доступ к экземпляру службы и может вызывать операцию непосредственно.

service.MyOperation("something"); 

Второй вещь, которую вы можете сделать, когда вы не хотите, чтобы запустить службу одноплодных вы можете сделать вашу реализацию сервиса просто обертка статического экземпляра общего класса, который на самом деле обрабатывать запросы. В качестве примера:

public class MyService : IMyService 
{ 
    private static IMyService instance = new MySharedServiceClass(); 

    public static IMyService Instance 
    { 
     get { return instance ; } 
    } 

    public bool MyOperation(string something) 
    { 
     return instance.MyOperation(something); 
    } 
} 

Затем вы можете вызвать метод в классе, как это:

var host = new ServiceHost(typeof(MyService)); 
var instance = MyService.Instance; 
instance.MyOperation("something"); 

я бы до сих пор не делать этого, если это вообще возможно. Подумайте сами, почему вы хотите, чтобы этот метод вызывался при запуске? Конечно, было бы лучше иметь этот код непосредственно в службе windows, если это что-то, что нужно запускать при запуске?

+0

Спасибо, второй вариант выглядит хорошо, у меня есть исключение. «ServiceHost поддерживает только типы обслуживания класса». хоть. – petrppe

+0

@petrppe Извините, отредактировал мое сообщение, чтобы задуматься. –

Смежные вопросы