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

时间:2013-03-18 16:29:30

标签: asp.net-mvc entity-framework repository-pattern multi-tenant

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

我正在使用Entity Framework和Repository Pattern。目前我有访问Location 1 DB的实现。我已经研究了实现位置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);
    }
}

CourseRepository

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>

1 个答案:

答案 0 :(得分:0)

抱歉,我明天有空的时候会尝试编辑并提供更完整的答案,但请检查此SO answer和城堡windsor容器doco以帮助您入门(也不知道是什么您正在使用的容器,但所有主要容器都应具有此功能。)

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

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