0

次の例で、最小限の冗長コードでマルチテナンシーを実装する効率的な方法は何ですか? このシナリオでは、テナントは学生です。学生の学校には 2 つの場所があり、それぞれの場所でデータ (コースなど) を個別のデータベースに保存する必要があります。学生がログインすると、学生の場所によってプルするデータベースが決まります。

Entity Framework と Repository Pattern を使用しています。現在、Location 1 DB にアクセスするための実装があります。HomeController コンストラクターに TenantContext を挿入するなど、場所 2 を実装するためのさまざまなオプションを調べましたが、正しいデータベース接続を設定する方法と、どのアプローチが最も効率的かについて行き詰まっています。

以下は、ロケーション 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>
4

1 に答える 1

0

申し訳ありませんが、明日時間があるときに編集してより完全な回答を提供しようとしますが、このSOの回答とキャッスルウィンザーコンテナdocoを確認して開始してください(また、使用しているコンテナはわかりませんが、主要なものはすべて持っている必要がありますこの機能)。

考えられるのは、Cookie から LocationID を読み取り、正しい接続文字列を取得して、コンテナーにそれをパラメーターとして dbcontext に渡すことです。

DbContext は覚えている部分クラスであるため、独自の部分 DbContext クラスを宣言し、それにインターフェイスを配置して、それを依存関係としてリポジトリに渡すことができます。

于 2013-03-21T12:04:07.630 に答える