WCF,SubSonic SimpleRepository和多线程

时间:2009-10-20 18:47:03

标签: wcf multithreading subsonic

我目前正在使用SubSonic SimpleRepository和WCF REST Contrib库编写WCF REST服务。该服务将在IIS 7上托管。数据库将成为MS SQL Server。我无法找到一个在互联网上使用这种技术组合的好例子。该服务应以RESTful方式公开数据库,但也包含一些业务规则(例如注册用户,保存统计信息),因此我无法使用ADO.net数据服务。因为会有很多客户同时访问该服务,所以该服务可以同时为多个客户服务。

为了获得良好的性能,我想使用以下服务行为:

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession, ConcurrencyMode=ConcurrencyMode.Multiple)]

Service类中没有实例变量,据我所知,这些属性值会导致为每个调用创建新的服务类实例(不是每个会话,因为它是通过https调用的)。

我使用以下简单类创建SimpleRepository一次(单例):

public class DB
{
    private static SimpleRepository _Repository;
    public static SimpleRepository Repository
    {
        get
        {
            if (_Repository == null)
            {
                _Repository = new SimpleRepository("5Drive", SimpleRepositoryOptions.RunMigrations);
            }
            return _Repository;
        }
    }
}

以下是我服务的示例方法:

接口:

    [OperationContract]
    [WebGet(UriTemplate = "vehicles")]
    [WebDispatchFormatter]
    Vehicles GetVehicles();

实现:

    public Vehicles GetVehicles()
    {
        // get all vehicles for the logged in user
        var vehicles = from v in DB.Repository.All<Vehicle>()
                       where v.UserID == GetUserID()
                       orderby v.Name
                       select v;
        return new Vehicles(vehicles);
    }

所以,这是我的问题:我可以这样做吗? SimpleRepository是线程安全的吗?我是否必须在每个方法中创建SimpleRepository而不是使用单例?当我这样做时表现怎么样?我查看了SimpleRepository源代码,我认为迁移代码不是线程安全的,因为“私有只读列表已迁移;”不同步,但我可能错了。

也许我错过了什么,我可以忽略多线程并以不同的方式配置IIS?

感谢您的帮助!

0 个答案:

没有答案