我目前正在使用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?
感谢您的帮助!