我已经启动了一个新的Web API项目,该项目要求我们根据发送到API的HTTP标头信息将应用程序正在运行的数据库切换到该数据库。应用程序用户将由HTTP标头标识,然后应用程序应更改为使用其数据库。
我有一个基本控制器CrudControllerBase<T>
(用于处理简单的通用HTTP请求),该控制器DataService<T>
在其构造函数中创建一个。我所有的控制器都将从该基本控制器派生,并将有权访问此DataService。的DataService
是用来做公共DB查询(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
I的构造函数中,我无权访问HttpRequestMessage才能将此信息传递给DataService
。
有人可以提出解决方案吗?如果有人可以提出建议,我很乐于尝试一种完全不同的方法。谢谢 !
好,这样我就可以了。它可能不是最好的解决方案,但是它可以工作,如果任何人有任何反馈/改进,请分享。感谢@AaronLS为我指出正确的方向。这篇文章也有很大帮助。
第一步是创建一个CustomControllerFactory
实现IHttpControllerActivator
接口的。这为您提供了一种Create
方法,您可以在其中编写自己的代码以更新控制器。这是我CustomControllerFactory
新建控制器以字符串形式传递HTTP Header的地方:
public class CustomControllerFactory : IHttpControllerActivator
{
public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
{
var schemaKey = request.Headers.Where(k => k.Key == "schema").FirstOrDefault().Value.FirstOrDefault();
return (IHttpController)Activator.CreateInstance(controllerType, new string[] { schemaKey });
}
}
下一步是告诉Web API使用此方法实例化控制器。为此,我将此行添加到了我的WebApiConfig
班级:
GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new CustomControllerFactory());
我需要做的最后一件事是向每个控制器添加一个构造函数,该构造函数接收字符串值并将其传递给基本控制器
public OrdersController(String databaseName) : base(databaseName) { }
然后我的基本控制器将参数传递给 DataService
public CrudControllerBase(String databaseName)
{
this._dataService = new DataService<T>(databaseName);
}
我的数据库将连接字符串传递给AppDbContext()构造函数
public DataService(String databaseName)
{
this._context = new AppDbContext(BuildConnectionString(databaseName));
}
我意识到还没有错误处理/安全检查,但是我将在:-)中添加
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句