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

时间:2016-02-12 07:37:07

标签: c# asp.net-mvc dependency-injection asp.net-mvc-5

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

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

客户端可以通过他们的域轻松区分,我可以通过Request.Url.Host或其他方法访问它,但是一旦我拥有了这个属性,我就无法在该请求的上下文中在业务逻辑项目中设置它只要。

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

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

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

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

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

...

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

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

    }

1 个答案:

答案 0 :(得分:0)

我对我的申请有同样的需求。我必须根据用户登录设置连接字符串和用户信息。我在System.out.println ^^上添加了一个引用,以便在我的业务层中获取System.Web对象。

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

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