关于设计模式:如何确定首次调用WCF单例服务?

How can I determine first call to WCF singleton service?

我正在使用推荐的InstanceContextMode将简单的Windows WCF服务编写为单实例。单服务行为,例如:

[服务行为(InstanceContextMode=InstanceContextMode.Single)]

我的代码如下(已编辑:已修改以反映评论者建议的更改)。问题是,我如何才能从我的构造函数中分辨出对我的服务的第一个调用已经发出了?也就是说,当第一次(也是唯一一次)实例化单例时?通过调试器进行的大量测试表明,从未调用构造函数。

enter image description here

我需要对服务的第一个调用做一些特殊的处理,而构造函数似乎是这样做的逻辑位置。但是,我尝试在构造函数中放置一些简单的代码,甚至无法在其中找到断点(使用远程调试)。这就像我使用InstanceContextMode时从未实际调用构造函数一样。单路由(与传统的经典方法相反,它有一个静态类和一个对象的静态引用,在构造函数中检查对该对象的引用以查看它是否为空等),而且,即使我可以在那里放置功能代码。

我是否无法通过InstanceContextMode.Single Route检查第一次调用?


我创建了一个简单的WCF服务(按照这里的教程使用[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]。默认构造函数只被调用一次,因为服务被标记为singleton。您可以从此构造函数调用方法spinupQueueMonitor(),并确保此操作执行一次。

如果这不起作用,请尝试创建静态构造函数。静态构造函数只调用一次。请在此处阅读静态构造函数的文档。我希望这能解决你的问题。

这是我使用的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
namespace WcfIis
{
    //Even though  the behavior is per call the static constructor will be called only once
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class Service1 : IService
    {
        public Service1()
        {

        }

        static Service1()
        {
            //SpinupQueueMonitor();
        }
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }

        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite == null)
            {
                throw new ArgumentNullException("composite");
            }
            if (composite.BoolValue)
            {
                composite.StringValue +="Suffix";
            }
            return composite;
        }
    }
}

如果你有什么问题,请告诉我。

谢谢您,索玛。