"Сменная" маршруты ASP.NET в MVC


Как мне справиться с мультитенантности с маршрутами в ASP.NET в MVC?

Приложение ASP.NET мультитенантного приложения MVC 3. Арендаторы определяются на основе хоста, так это не мешает маршрутизации.

Другая важная информация:

  • Приложение имеет ряд особенностей (или плагины). Это принципиально другие веб-проекты с собственными контроллерами, мнения и маршруты.

  • Маршрутизации ASP.NET в MVC является нашей точкой входа в эти функции.

  • Один ключевой момент заключается в том, что все функции одинаково для всех арендаторов. Переменная является ли арендатор фактически подписались на эту функцию.

Итак, представьте, у нас есть функция "блог" с маршрутом, как так:

/blog/{instance}/posts

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

В настоящее время я делаю это с помощью настраиваемого маршрута:

private readonly IFeatureMetadata feature;

public FeatureRoute(IFeatureMetadata feature, string url, RouteValueDictionary defaults, IRouteHandler handler) :
    base(url, defaults, handler) 
{
    if (feature == null)
        throw new ArgumentNullException("feature");
    this.feature = feature;
}

public override RouteData GetRouteData(System.Web.HttpContextBase httpContext) 
{
    var routeData = base.GetRouteData(httpContext);

    if (routeData == null)
        return null;

    var context = DependencyResolver.Current.GetService<ISiteContext>();
    var site = context.GetSite();
    var matchedInstances = site.FeatureInstances.Where(f => f.Feature.FeatureType == feature.FeatureType);

    if (!matchedInstances.Any())
        return null;

    if (routeData.Values["instance"] == null) 
    {
        routeData.Values["instance"] = matchedInstances.First().Id;
    }

    return routeData;
}

Единственное, что мне нужно обслужить-это маршруты, которые не определяют экземпляр.

Например, арендатор может иметь один или несколько блогов. Если он только один, то исходящие маршруты должны просто генерировать:

http://[domain]/blog/posts

Если он имеет больше, чем один, то мы должны создать:

http://[domain]/blog/{instance}/posts

Сейчас я справляюсь с этим путем регистрации 2 стороны (одна с {экземпляр} параметра и один без). В приведенном выше коде вы можете увидеть, что если экземпляр параметра не существует в RouteData мы просто добавить идентификатор первого сопоставленного объекта экземпляра.

Это достаточно для меня, чтобы позвонить в моем блоге сервиса:

GetPosts(int featureInstanceId);

Пока все "работает", я ищу отзывы о моей реализации. Как независимый разработчик, это, кажется, единственный способ я могу сделать мой код пересмотреть.



Комментарии
2 ответа

Вы также можете создать ограничение по маршруту, который перенаправляет или изменяет routedata "купить модуль".

http://msdn.microsoft.com/en-us/library/cc668201.aspx#adding_constraints_to_routes

http://www.jfarrell.net/2008/11/asp-net-mvc-authentication-strategies.html

2
ответ дан 20 декабря 2011 в 09:12 Источник Поделиться

Один из способов справиться с этим-написать ActionFilter, что проверка в отношении перечня услуг заказчик владеет, и если они не владеют этим свойством, он направляет их, чтобы купить его.

0
ответ дан 12 мая 2011 в 07:05 Источник Поделиться