0

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

我正在使用实体框架和存储库模式。目前我有访问位置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); 
    } 
} 

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发生器genereated)

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> 
+0

我不认为你明白多租户的含义。多租户意味着您有多个网站都使用相同的代码库,并且只通过其URL(或可能在用户登录中的信息)进行区分。在这种情况下,您可能会有两个网站提供相似的内容,并使用相同的代码,但使用不同的主题或不同的布局,具体取决于用户输入的网址。 – 2013-03-18 17:08:46

+0

好的,那么上面这种情况是否存在一个术语?代码可能会为不同用户重叠但数据源不同。 – user1620141 2013-03-18 17:27:51

+0

这是一个引导我进入多租户的帖子的例子:http://stackoverflow.com/questions/2624154/using-multiple-databases-within-one-application – user1620141 2013-03-18 18:00:44

回答

0

对不起,我会尝试编辑,并提供一个更完整的答案时,我得到明天的时间,但检查该SO answer和温莎城堡容器doco让你开始(也不知道你使用的是什么容器,但所有主要的容器都应该有这个功能)。

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

DbContext是一个部分类记住,所以你可以声明你自己的部分DbContext类,把一个接口,并作为一个依赖到您的存储库。

+0

非常感谢您的帮助和链接。我正在使用StructureMap。 – user1620141 2013-03-21 17:22:46