ASP.NET Web API-更改数据库应用程序正在运行,基于HTTP标头信息

基思

我已经启动了一个新的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的构造函数,但是在CrudControllerBaseI的构造函数中,我无权访问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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

纯asp.net Web API应用程序

来自分类Dev

Asp.net Web API DateTimeOffset设置与HTTP标头的偏移量

来自分类Dev

ASP.NET Web API格式化程序

来自分类Dev

使用EF数据库优先应用程序部署ASP.NET Web API

来自分类Dev

缓存Asp .Net Web API

来自分类Dev

ASP.net Web API响应-循环数据

来自分类Dev

ASP.NET Web API会话数据

来自分类Dev

从SQL DB for ASP.NET Web窗体API获取数据

来自分类Dev

ASP.NET Web API破坏存储库/服务模式

来自分类Dev

使用角度$ http获取与ASP NET Web API

来自分类Dev

ASP.NET MVC Web应用到REST API

来自分类Dev

具有基于角色的授权的ASP.NET Web Api

来自分类Dev

在IIS上运行ASP.NET 5 Web.API

来自分类Dev

ASP.NET Web API SaveChangesAsync与外键数据

来自分类Dev

ASP.NET Web API REST服务:HTTP错误405

来自分类Dev

使用.NET Core Web API作为ASP.NET Web窗体应用程序的子路由

来自分类Dev

ASP.NET核心Web API:基于数据库权限的授权

来自分类Dev

asp.net Web API HTTP PUT方法

来自分类Dev

使用角度$ http获取与ASP Net Web API

来自分类Dev

Asp.net Web应用程序和Asp.net Web API2之间的共享会话(Asp.net Web API2托管在访问一种配置的Asp.net Web应用程序下)

来自分类Dev

带数据库连接的asp.net WEB API

来自分类Dev

ASP.NET MVC Web应用程序循环访问和修改数据库的最佳实践

来自分类Dev

开发ASP.NET WEB API服务应用程序

来自分类Dev

从IIS运行ASP.NET MVC 6 Web API

来自分类Dev

ASP.NET Web API-SQL-检索信息

来自分类Dev

ASP.NET Core Web API引发HTTP 500

来自分类Dev

ASP .Net Core Web 应用程序调用 Web API

来自分类Dev

部署asp net core web应用程序后找不到Web API 404

来自分类Dev

我正在开发 asp .net Web API 以在我的 Android 应用程序中使用它,

Related 相关文章

热门标签

归档