如何确定首次调用WCF单例服务?

时间:2016-04-28 21:58:54

标签: wcf design-patterns singleton

我使用推荐的InstanceContextMode.Single服务行为将简单的Windows WCF服务编写为单例,例如:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]

我的代码如下所示(已修改:已修订以反映评论者建议的更改)。问题是,如何在我的构造函数中告诉我第一次调用我的服务?也就是说,当单身人士第一次(也是唯一一次)被实例化时?通过调试器进行的广泛测试表明,构造函数永远不会被调用。

enter image description here

我需要在第一次调用服务时进行一些特殊处理,构造函数似乎是合理的地方。但是,我尝试在构造函数中放置一些简单的代码,甚至无法在那里找到断点(使用远程调试)。如果我使用 InstanceContextMode.Single 路由,那么构造函数永远不会被调用(与具有静态类和对象的静态引用的旧经典方法相反,检查在构造函数中引用该对象以查看它是否为空等等。)而且,即使我可以在其中放置功能代码,我也不知道要在构造函数中检查什么。

通过 InstanceContextMode.Single 路线,我是否失去了检查第一个电话的能力?

1 个答案:

答案 0 :(得分:0)

我创建了一个简单的WCF服务(在教程here之后使用[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]。默认构造函数只被调用一次,因为服务被标记为singleton。你可以调用你的方法SpinupQueueMonitor ()来自这个构造函数,可以确保执行一次。

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

以下是我使用的示例代码:

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

如果您有任何问题,请告诉我。

谢谢你, 索玛。