Могу ли я обрабатывать различные мультитенантности с помощью глобального фильтра? - PullRequest
0 голосов
/ 10 марта 2011

У меня есть приложение asp.net mvc, в котором реализовано членство. Таким образом, пользователь должен войти в систему. Каждый пользователь принадлежит организации (многопользовательская).

Как бы я обработал глобальный параметр организации? Я думал, что это может быть хорошей вещью для глобального фильтра, потому что все данные должны быть отфильтрованы для данной организации. И организация связана с именем пользователя, но не в той же таблице.

например, у меня есть действие индекса как это

public ActionResult Index()
{
var result = _repository.GetListByOrganisation(organisation);
return View(result);
}

Я думал о наличии глобального атрибута, который запрашивает базу данных для организации на основе заданного имени пользователя. Поскольку мой контроллер уже содержит атрибут authorize, у меня есть имя пользователя. Было бы неплохо кэшировать организацию (сеанс, controllercontext) и не запрашивать организацию из базы данных при каждом запросе.

Это способ реализовать что-то подобное? Или есть другие способы, которые были бы лучше? И как я могу установить свойство для контроллера / контроллера контекста из фильтра?

Так что любые мысли по этому поводу, а также комментарии были бы великолепны ...

Ответы [ 2 ]

2 голосов
/ 10 марта 2011

Я бы сделал это через DI.

Вы можете использовать сторонний DI-контейнер или свой собственный код. В любом случае вы хотите установить идентификатор организации на основе для каждого запроса .

Итак, вы будете создавать единицу работы и вставлять ее в свой контроллер. Для простоты давайте представим, что ваша единица работы - это поле _repository в вашем примере кода, хотя большинство реальных приложений более сложны.

Вы добавляете параметр конструктора в контроллер:

public FooController(IFooRepository repository)
{
    this._repository = repository;
}

... и идентификатор организации на FooRepository:

public class FooRepository: IFooRepository
{
    public FooRepository(long organizationId)
    {
        this._organizationId = organizationId;
    }
}

Теперь в настройках вашего DI-контейнера или фабрики контроллеров MVC вы все это настроите:

builder.Register(c => new FooRepository(GetOrgIdForCurrentUser()).As<IFooRepository>();
builder.Register(c => new FooController(c.Resolve<IFooRepository>());
1 голос
/ 10 марта 2011

Возможно, вы могли бы встроить организацию в URL, например, если ваш маршрут выглядит следующим образом / {organization} / {controller} / {action}

, тогда вы получите URL-адреса вроде

  • / bigorg / products / list
  • / smallorg / products / list

и вы получите организацию в вашем контроллере, либо параметр для вашего метода, либочерез объект RouteData.

...