2013-04-16 2 views
0

У меня есть сервис, который просто обертывает методы компонентов. Я создаю сервис программно, и мне нужно инициализировать его с помощью компонента (либо пройти в качестве параметра в конструкторе, либо установить метод настройки, либо любым способом). Мой сервис выполняется самостоятельно в службе Windows. Я читал о IInstanceProvider и ServiceHost aproach, однако я думаю, что это, вероятно, больше используется для контейнеров DI, и что мне нужно сделать, должно быть намного проще. Любые советы будут оценены. Вот мой пример кода:wcf service initialisation

  1. Программным создания службы:

    _plcServiceHost = new ServiceHost(typeof(PLCService)); 
    
    
        foreach (var plc in PLCRepository.GetAllLocal()) 
        { 
         var baseAddress = plc.LocalEndpointName; 
    
         var binding = new NetTcpBinding(); 
    
         _plcServiceHost.AddServiceEndpoint(typeof(IPLCService), binding, baseAddress); 
    
    
         AddMetadataExchange(_plcServiceHost, baseAddress); 
        } 
    
    _plcServiceHost.Open(); 
    

Это, как я хотел бы иметь свою службу (2а или 2b). 2a. ПЛК с установщиком:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
    public class PLCService : IPLCService 
    { 
     #region fields 
     public static volatile object HardwareLock = new object(); 
     private IPLCImpl _plc; 
     private Semaphore _unsubscribeSem; 
     private bool _isSubscribed; 

     #endregion 

     public void SetPLC(IPLCImpl plc) 
     { 
      if (plc == null) throw new ArgumentNullException("plc"); 

      _plc = plc; 

      _plc.Connect(); 
     } 

2b. PLC Service с инициализацией на конструктор:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
    public class PLCService : IPLCService 
    { 
     #region fields 
     public static volatile object HardwareLock = new object(); 
     private readonly IPLCImpl _plc; 
     private Semaphore _unsubscribeSem; 
     private bool _isSubscribed; 

     #endregion 

     public PLCService(IPLCImpl plc) 
     { 
      if (plc == null) throw new ArgumentNullException("plc"); 

      _plc = plc; 

      _plc.Connect(); 
     } 

ответ

0

Вы можете инициализировать реализацию из-за пределов вашей службы, используя упомянутый DI как Unity, замок, и так далее.

Таким образом, вы можете просто использовать его в конструкторе PLCService.