Как динамически переключаться между несколькими контекстами (из одной базы) в Code First - PullRequest
4 голосов
/ 02 января 2012

Я работаю над решением, в котором есть проект Core с DbContext (с именем CoreContext). Этот контекст содержит сущность (Product), среди прочего, которая ссылается на абстрактный класс (ProductConstraints), который предоставляет общие правила проверки для общего продукта. Этот контекст никогда не используется напрямую. В том же решении есть три других проекта (Product1, Product2 и Product3), которые наследуют класс CoreContext (как ProductXContext) и ProductConstraints (как ProductXConstraints), который реализует пользовательские правила проверки для своего конкретного продукта.

Есть также другой проект, который содержит пользовательский CodeFirstMembership. Это сущность «Пользователь» содержит свойство «Продукт», которое определяет продукт, с которым будет работать пользователь.

Наконец, у меня есть проект MVC3, в котором я хочу создать соответствующий контекст на основе информации о продукте текущего пользователя. Создание чего-то вроде ContextFactory, который получает этот продукт и возвращает правильный DbContext. Я попробовал несколько подходов, но без значительного успеха.

1 Ответ

3 голосов
/ 03 января 2012

Вы можете использовать инъекцию зависимостей для решения вашей проблемы.Если пользователь привязан только к одному продукту, вы можете сохранить эту информацию в Session, чтобы избежать повторных обращений к базе данных.

public class ContextFactory
{    
     public CoreContext CreateContext()
     {
         var product = HttpContext.Current.Session["Product"] as string;

         //resolve the correct context

         return context;
     }
}

Затем вы можете зарегистрировать фабрику в своем контейнере DI.*

Тогда вы можете использовать инжектор конструктора в ваших контроллерах

public class MyController : Controller
{
     public MyController(CoreContext context)
     {

     }    
}
...