如何根据传入请求在 MVC 5 中动态设置连接字符串

本文关键字:动态 设置 字符串 连接 MVC 何根 请求 | 更新日期: 2023-09-27 18:34:15

我有一个 MVC 5 应用程序,它目前只有单租户,但随着客户群的增长,它变得难以管理。

我想将此应用程序转换为多租户应用程序,为每个客户端访问不同的数据库。

客户端的域很容易通过其域来区分,我可以通过 Request.Url.Host 或其他方法访问该域,但是一旦我拥有此属性,我就无法仅在该请求上下文中的业务逻辑项目中设置它。

业务逻辑项目由主 Web 项目引用,但该项目与请求对象闪烁,因此我不知道每次实例化 baseDataAccess(包含连接字符串(对象时如何动态获取该会话信息。

我花了很多时间在这上面,并尝试使用 Ninject 来解决依赖关系,但没有成功。我似乎无法弄清楚如何获取动态请求对象或其任何属性以暂时分配给 baseDataAccess 对象。

我尝试的最后一件事是使用 OnActionExecute 方法使用 IActionFilter,但我仍然无法弄清楚如何在没有当前请求上下文的项目中为每个请求动态设置 URL 的值。

这是我想要动态设置的类。 _connectionString是动态属性。我有基于 url 构建连接字符串的方法,因此,如果我可以动态和暂时地设置 _domain 属性,我将能够获取连接字符串。

public class baseDataAccess : IDataAccess
{
    private static IClientConnection _clientConnection;
    private static string _connectionString;
    public static string _domain;

这是我最后一次尝试,将 OnActionExecute 方法添加到每个控制器。如何动态和暂时地设置这些属性?

    public void OnActionExecuting(ActionExecutedContext filterContext)
    {
        IClientConnection client = new ClientConnectionFactory(Request.Url.Host);
        IDataAccess dataAccess = new baseDataAccess(client);
    }

如何根据传入请求在 MVC 5 中动态设置连接字符串

我对我的应用程序也有同样的需求。我必须根据用户登录设置带有用户信息的连接字符串。我在System.Web上添加了一个引用,以便在业务层中获取Session对象。

主要思想是,将当前用户存储在Session中,并让业务逻辑访问此Session HttpContext.Current.Session现在我的数据库类可以在每次访问数据库时动态读取连接字符串。

由于用户会话在任何具有System.Web引用的库中都可用,因此可以在应用程序范围内使用。因此,根据用户的请求,在 Session_Start 事件上设置连接字符串没有问题。