如何处理WCF服务中的静态方法?

时间:2012-12-03 09:55:50

标签: c# wcf static singleton

我是WCF的初学者。我正在尝试使设备驱动程序网络可访问。 我现在的代码,简化:

A.cs

public class A {
    public int source;
}

Driver.cs

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;
    }
}

DllImport.cs

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.MyServiceClientMyServiceReference是我添加到客户端的服务引用的名称)是什么?为什么在服务器上调用MyService类的私有构造函数?

2)我怎样才能在客户端做这样的事情?

MyServiceReference.Driver d = MyServiceRefernce.Driver.OpenDevice(0);

我已阅读有关InstanceContextMode但未确定如何使用我的情况。

我理解我很难理解我的确切要求,但我也很难解释!我希望我能和我一起认识WCF的人。


我使用的实际驱动程序源位于this file中的Assembly文件夹中。

2 个答案:

答案 0 :(得分:2)

通常,WCF没有会话,因此所有呼叫都是相互独立的。因此,您应该将Driver函数封装到可服务的方法中。因此,一种方法将为设备的一个工作单元提供服务,该设备将被打开 - >做的 - >每次通话都关闭。

答案 1 :(得分:2)

通过使服务类成为单例,您不能使WCF服务使用单个实例。您需要配置WCF服务,以便它仅使用单个实例。您还可以创建基于会话的WCF服务。例如,请参阅this