我想在運行時在REST Api中將連接更改爲數據庫。我想放一個請求的變量,讓Api決定使用哪個連接字符串。使用MVC在運行時更改數據庫WebApi 2
例如: 我在請求標題中放置值爲「develop」的變量「dbid」併發送給Api。
Api看到標題並從web.config中獲取正確的連接字符串。
我有三層(數據,業務,api)。數據包含EntityFramework來獲取和設置數據。就像這樣:
public class WebsiteContext : IocDbContext, IWebsites
{
public DbSet<Website> Websites { get; set; }
public IEnumerable<Website> GetAll()
{
return Websites.ToList();
}
}
(IoCDbContext.cs)
public class IocDbContext : DbContext, IDbContext
{
public IocDbContext() : base("develop")
{
}
public void ChangeDatabase(string connectionString)
{
Database.Connection.ConnectionString= connectionString;
}
}
在業務我有一個類來檢索數據層數據,並做一些邏輯的東西(沒有必要在這裏,但對於尚好故事)。
public class Websites : IWebsites
{
private readonly Data.Interfaces.IWebsites _websiteContext;
#region Constructor
public Websites(Data.Interfaces.IWebsites websiteContext)
{
_websiteContext = websiteContext;
}
#endregion
#region IWebsites implementation
public IEnumerable<Website> GetWebsites()
{
List<Data.Objects.Website> websiteDtos = _websiteContext.GetAll().ToList();
return websiteDtos.Select(web => web.ToModel()).ToList();
}
#endregion
}
public static class WebsiteMapper
{
public static Website ToModel(this Data.Objects.Website value)
{
if (value == null)
return null;
return new Website
{
Id = value.Id,
Name = value.Name
};
}
}
而且,最後但並非最不重要的,控制器:
public class WebsiteController : ApiController
{
private readonly IWebsites _websites;
public WebsiteController(IWebsites websites)
{
_websites = websites;
}
public IEnumerable<Website> GetAll()
{
return _websites.GetWebsites().ToList();
}
}
我的統一配置:
public static void RegisterComponents()
{
var container = new UnityContainer();
container.RegisterType<Business.Interfaces.IWebsites, Websites>();
container.RegisterType<IDbContext, IocDbContext>();
container.RegisterType<IWebsites, WebsiteContext>();
// e.g. container.RegisterType<ITestService, TestService>();
GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
因此,大家可以看到在連接字符串名稱爲 「發展」 是默認使用。這將返回一個名爲「網站」的網站。現在我將標題變量「dbid」更改爲「live」。 api應該看到這個,並且應該得到與「live」名稱相對應的連接字符串。這最後一部分是我正在嘗試的,但沒有任何工作。
此我想:
- 添加會話的WebAPI。這意味着我打破REST API的無狀態的想法:沒有做過
- 靜也不能工作,因爲每個人都可以得到相同的ConnectionString,但其用戶特定
- 谷歌,但大多數的例子並不適合我 工作
- 正在搜索StackOverflow ...查看前一點。
這讓我瘋狂!應該有一種方法來改變請求頭中的值給出的連接字符串,對嗎?
因此,讓我得到這個直:在ISiteContex是確定要使用的連接字符串的邏輯是什麼? (如siteContext.SiteType中所述)。如果是這樣,你能幫我解決並添加該接口的實現嗎? –
我已經添加了一些實現代碼。讓我知道這是否有幫助。您可以輕鬆更改爲使用標題而不是路徑,或者在web.config中添加其他連接字符串值,並使用「name」而不是從web.config中複製的格式化連接字符串引用它們。 –
是的,這是有效的。現在看,它看起來很簡單。我完全錯過了HttpContext.Current.Request.RequestContext.RouteData(對於我的請求標題),所以我無法弄清楚如何從請求中獲取信息並將其放入正確的變量中。 。在構造函數中這樣做。那麼,另一件事情學到了。感謝您的完美解釋和幫助 –