方案A:假设您在同一SQL Server / SQL Azure实例上有多个数据库共享完全相同的结构,其中数据库名称是基于约定的,如db001,db002,...和单个RESTier服务必须能够为每个REST调用寻址正确的数据库,具体取决于请求标头或URI路径或查询字符串上提供的某些特性。
方案B:单个RESTier服务必须能够处理web.config文件中定义的多个连接字符串,具体取决于请求中提供的某些特性。
在这两种情况下,基本问题都是相同的,单个RESTier服务能够处理多个数据库的请求,客户端必须在每个请求上提交要使用的数据库的提示,这是典型的多租户方案。我使用RESTier版本0.6,实体集自动从实体框架模型公开:
public class Entities : EntityFrameworkApi<SalesEntities> {
问题,您如何建议实施此类多租户方案?
答案 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(服务器));
如果您对此有任何疑问,请与我联系。