繁体   English   中英

ASP.NET MVC应用程序中的多租户

[英]Multi Tenancy in ASP.NET MVC Application

在下面的示例中,用最少的冗余代码实现多租户的有效方法是什么? 在这种情况下,租户是一名学生。 学生所在的学校有2个地点,每个地点都需要将数据(即课程)存储在单独的数据库中。 学生登录时,他们的位置决定了要从哪个数据库中提取。

我正在使用实体框架和存储库模式。 目前,我已经实现了访问位置1数据库的实现。 我已经研究了实现位置2的不同选项,例如在HomeController构造函数中注入TenantContext,但是我一直在坚持如何设置正确的数据库连接以及哪种方法最有效。

以下是仅位置1的代码。

控制器示例

public class HomeController : Controller
{
    ICourseRepository courseRepository;

    //How to set the correct repository to use based on location?
    public HomeController(ICourseRepository courseRepository)
    {
        this.courseRepository = courseRepository;
    }

    //Register for a new class
    public ViewResult Register()
    {
        var courseList = courseRepository.AvailableCourses();
        return View(courseList);
    }
}

课程资料库

public class CourseRepository : ICourseRepository
{
    private Location1DB context = new Location1DB();

    public List<Course> AvailableCourses()
    {
        //Get available courses from Location 1 Course Table
    }
}

Location1Model.Context.cs (使用EF DbContext Generator生成)

public partial class Location1DB: DbContext
{
    public Location1DB()
        : base("name=Location1DB")
    {
    }

    public DbSet<Course> Courses { get; set; }
}

Web.config

<connectionStrings>
     <add name="Location1DB" ... />
     <add name="Location2DB" ... />
</connectionStrings>

抱歉,明天我有时间时,我会尝试编辑并提供更完整的答案,但是请检查此答案以及Castle Windsor集装箱doco以使您入门(也不确定您使用的是哪个集装箱,但所有主要的集装箱都应该有)此功能)。

想法是从cookie中读取LocationID,获取正确的连接字符串,并使容器将其作为参数传递给dbcontext。

记住DbContext是一个局部类,因此您可以声明自己的局部DbContext类,在其上放置一个接口,并将其作为依赖项传递到存储库中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM