0

假设我有一个 WCF 服务可以访问多个客户端之间共享的某些数据。这两种设置有什么区别:

1)Instancing:Single,Concurrency:Multiple,共享数据存储在实例变量中。

2)实例化:每次调用,并发:多个,共享数据存储在静态变量中。

有什么实际区别吗?无论哪种方式,我都必须确保共享数据是线程安全的,但我想知道一种特定方法是否有任何优势。

4

1 回答 1

1

从概念上讲,没有区别。正如您所说,无论哪种方式,您都必须同步对共享数据的访问。实际上,第二种选择更好。来自关于 WCF的权威书籍,Juval Lowy的Programming WCF Services

...每次调用服务实际上是 WCF 服务的首选实例管理模式...建议您在一般情况下避免单例,并找到共享单例状态而不是单例实例本身的方法。

我为我的项目使用选项#2。WCF 服务本身只是执行工作的类的静态方法的一个薄外观。例如,

public class Logger
{
    private static List<Logger> _loggers = new List<Logger>();
    private static object _sync = new object();

    public static void Start()
    {
        Logger logger = new Logger();
        logger.Start();

        lock (_sync) {
            _loggers.Add( logger );
        }
    }

    private Logger()
    {
        // construct the Logger object...
    }

    private void Start()
    {
        // start the logger here...
    }
}

public class LoggingService : ILoggingService
{
    public void StartLogger()
    {
        Logger.Start();
    }
}

显然,我省略了许多细节,但这表明了总体思路。

于 2010-11-13T00:01:44.697 回答