如何根据请求选择一个RESTier 0.6.0服务选择数据库?

时间:2016-09-28 18:13:48

标签: odata restier

方案A:假设您在同一SQL Server / SQL Azure实例上有多个数据库共享完全相同的结构,其中数据库名称是基于约定的,如db001,db002,...和单个RESTier服务必须能够为每个REST调用寻址正确的数据库,具体取决于请求标头或URI路径或查询字符串上提供的某些特性。

方案B:单个RESTier服务必须能够处理web.config文件中定义的多个连接字符串,具体取决于请求中提供的某些特性。

在这两种情况下,基本问题都是相同的,单个RESTier服务能够处理多个数据库的请求,客户端必须在每个请求上提交要使用的数据库的提示,这是典型的多租户方案。我使用RESTier版本0.6,实体集自动从实体框架模型公开:

public class Entities : EntityFrameworkApi<SalesEntities> { 

问题,您如何建议实施此类多租户方案?

2 个答案:

答案 0 :(得分:1)

您可以使用如下所示的参数化routePrefix并解析网址的那部分(HttpContext.Current.Request.RawUrl)。

config.MapRestierRoute<Entities>("EntitiesApi", "api/{entitiesConfig}", new RestierBatchHandler(server)); 

从Web.config中检索正确的connectionString并使用它来创建DbContext:

Match match = Regex.Match(HttpContext.Current.Request.RawUrl, @"/api/(?<entitiesConfig>[A-Za-z0-9\-]+)/", RegexOptions.IgnoreCase);
string entitiesConfig = "DefaultEntitiesContext";
if (match.Success)
    entitiesConfig = match.Groups["entitiesConfig"];
string connectionString = System.Configuration.ConfigurationManager.ConnectionStrings[entitiesConfig].ConnectionString;
var db = new SalesEntities(connectionString);

答案 1 :(得分:0)

对于您的场景,我认为您将有两个DbContext,每个DbContext连接到一个数据库实例,那么这样的内容对您有用吗?

在configure方法中,我们调用MapRestierRoute两次,每个都将处理一个具有不同路由前缀的DbContext,当用户发起请求时,请求URL将包含前缀并将自动路由到相关的数据库实例。

config.MapRestierRoute&gt;(“TrippinApi”,“api / TrippinA”,新的RestierBatchHandler(服务器)); config.MapRestierRoute&gt;(“TrippinApi”,“api / TrippinB”,新的RestierBatchHandler(服务器));

如果您对此有任何疑问,请与我联系。