我是WCF的初学者。我正在尝试使设备驱动程序网络可访问。 我现在的代码,简化:
public class A {
public int source;
}
public class Driver {
// some fields here
A a;
// singleton class
private Driver() {
a = null;
// some more code
}
// static methods
public static Driver OpenDevice(int n) {
Driver d = null;
// some code
i = GetBoardNumber();
// some native code to actually open driver ONLY IF it wasn't already opened!
d = new Driver();
return d;
}
public static int GetDeviceNumber() {
// some native code get device number
return someInt;
}
// some non static methods which use native code
// example:
public int ResetDevice(){
// some code
// call native i_ResetDevice() method
return code;
}
}
public class DllImport {
// some code to import method definitions from dll
// example:
[DllImport("MyDeviceDriverProvidedForWindows.dll")]
public static extern int i_ResetDevice();
// some more code
}
这个驱动程序对我来说效果很好。在控制设备的示例中,我只是添加对此驱动程序的引用,并使用驱动程序的方法控制设备。
MyService d = Driver.OpenDevice(0);
d.ControlDevice();
我的工作是使这个驱动程序远程可访问,我选择使用WCF。
因为我已经实现了,所以我通过放置OperationContracts和适当的位置来提取接口并将其转换为有效的WCF服务合同。这个提取的接口没有OpenDevice和GetDeviceNumber方法,因为它们是静态的。
我遇到的问题是:
1)打开WSDL文件告诉我在客户端中使用这样的代码:
MyServiceClient client = new MyServiceClient();
// access client operations
// close client
client.Close();
这是MyServiceRefernce.MyServiceClient
(MyServiceReference
是我添加到客户端的服务引用的名称)是什么?为什么在服务器上调用MyService类的私有构造函数?
2)我怎样才能在客户端做这样的事情?
MyServiceReference.Driver d = MyServiceRefernce.Driver.OpenDevice(0);
我已阅读有关InstanceContextMode
但未确定如何使用我的情况。
我理解我很难理解我的确切要求,但我也很难解释!我希望我能和我一起认识WCF的人。
我使用的实际驱动程序源位于this file中的Assembly文件夹中。
答案 0 :(得分:2)
通常,WCF没有会话,因此所有呼叫都是相互独立的。因此,您应该将Driver函数封装到可服务的方法中。因此,一种方法将为设备的一个工作单元提供服务,该设备将被打开 - >做的 - >每次通话都关闭。
答案 1 :(得分:2)
通过使服务类成为单例,您不能使WCF服务使用单个实例。您需要配置WCF服务,以便它仅使用单个实例。您还可以创建基于会话的WCF服务。例如,请参阅this。