У меня есть сервис, который просто обертывает методы компонентов. Я создаю сервис программно, и мне нужно инициализировать его с помощью компонента (либо пройти в качестве параметра в конструкторе, либо установить метод настройки, либо любым способом). Мой сервис выполняется самостоятельно в службе Windows. Я читал о IInstanceProvider и ServiceHost aproach, однако я думаю, что это, вероятно, больше используется для контейнеров DI, и что мне нужно сделать, должно быть намного проще. Любые советы будут оценены. Вот мой пример кода:wcf service initialisation
Программным создания службы:
_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();
}