我有一个简单包装组件方法的服务。 我以编程方式创建服务,我需要使用组件初始化它(作为构造函数中的参数传入,具有setter方法或任何方式)。我的服务是在Windows服务中自托管的。我读到了有关IInstanceProvider和ServiceHost方法的内容,但我认为它可能更多地用于DI容器,而我需要做的事情应该更加简单。 任何建议将不胜感激。这是我的示例代码:
以编程方式创建服务:
_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();
这就是我想要服务的方式(2a或2b)。 2A。带有setter的PLC服务:
[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服务:
[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 :(得分:0)
您可以使用提到的DI,如Unity,Castle等,从服务外部启动实施。
通过这种方式,您可以在PLCService
构造函数中使用它。