我已經啓動了一個新的Web API項目,該項目要求我們根據發送到API的HTTP頭信息切換應用程序運行的數據庫。應用程序用戶將通過HTTP頭標識,然後應用程序應更改爲使用其數據庫。ASP.NET Web API - 基於HTTP頭信息運行更改數據庫應用程序
我有一個基礎控制器CrudControllerBase<T>
(處理簡單的通用HTTP請求),它在它的構造函數中創建一個DataService<T>
。我的所有控制器都將從此基礎控制器派生,並且可以訪問此DataService。 DataService
用於執行常見的數據庫查詢(FindById(),FindAll()等),而更復雜的查詢則使用擴展方法。
public abstract class CrudControllerBase<T> : ApiController where T : class, IEntity
{
protected IDataService<T> _dataService;
public CrudControllerBase()
{
this._dataService = new DataService<T>();
}
[HttpGet]
public virtual async Task<IHttpActionResult> Get(Guid id)
{
var model = await _dataService.FindByIdAsync(id);
return Ok<T>(model);
}
//code left out
}
public class OrdersController : CrudControllerBase<OrderItem>
{
}
,並在DataService在我新出的DbContext類:
public class DataService<T> : IDataService<T> where T:class, IEntity
{
private readonly AppDbContext _context;
public DataService()
{
_context = new AppDbContext(); // need to pass in connection string
}
// code left out
}
我需要能夠在連接字符串中傳遞給AppDbContext的構造函數,但在CrudControllerBase
構造我不有權訪問HttpRequestMessage以便能夠將此信息傳遞給DataService
。
任何人都可以提出解決方案嗎?如果有人能夠提出建議,我很樂意嘗試一種完全不同的方式。謝謝 !
您可能能夠創建一個自定義控制器工廠,無論是封裝還是從DefaultControllerFactory繼承,因爲有一個重載需要RequestContext,然後你可以給你的控制器構造函數一個參數:http://www.dotnetcurry.com/showarticle.aspx?ID=878 – AaronLS 2014-08-29 23:57:39