Упрощение настройки маршрутов обслуживания WCF4 RESTful - PullRequest
0 голосов
/ 05 февраля 2012

Файл Global.asax.cs по умолчанию из шаблона проекта «WCF REST Template 40 (CS)» и каждого учебного пособия, которое я видел в Интернете, включают в себя вариант следующего метода:

private void RegisterRoutes()
{
    // Edit the base address of Service1 by replacing the "Service1" string below
    RouteTable.Routes.Add(new ServiceRoute("Service1", new WebServiceHostFactory(), typeof(Service1)));
}

Управлениемаршрутизация услуг таким способом кажется излишне громоздкой, когда сам WebApplication должен иметь возможность определять, какие службы должны быть доступны, и применять маршруты на основе соглашения или метаданных.

ВОПРОСЫ

  1. Есть ли встроенный способ за пределами по умолчанию для определения маршрутов обслуживания (настраивается в web.config или компилируется всама услуга)?
  2. Всегда ли другие, использующие этот шаблон, следуют предоставленной модели или кто-то другой придумал лучший подход?

Предлагаемое решение

Мигрировал предложенное мной решение в ответ

1 Ответ

0 голосов
/ 10 февраля 2012

Полагаю, я должен предположить, что молчание - это принятие.Вот мое решение (первоначально из моего вопроса):

Предполагая, что нет ничего лучше встроенного или доступного иным способом (потому что я ничего не нашел), моя попытка сделать это включает определение атрибута:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)]
public class ServiceRouteAttribute : Attribute
{
    public string RoutePrefix { get; set; }
    public Type ServiceFactoryType { get; set; }

    public ServiceHostFactoryBase ServiceFactory
    {
        get
        {
            if (ServiceFactoryType == null || !ServiceFactoryType.IsRelated(typeof(ServiceHostFactoryBase)))
                return null;

            return Activator.CreateInstance(ServiceFactoryType) as ServiceHostFactoryBase;
        }
    }

    public ServiceRouteAttribute() : this(string.empty) { }
    public ServiceRouteAttribute(string routePrefix) : this(routePrefix, typeof(WebServiceHostFactory)) { }
    public ServiceRouteAttribute(string routePrefix, Type serviceFactoryType)
    {
        RoutePrefix = routePrefix;
        ServiceFactoryType = serviceFactoryType;
    }
}

, который используется для оформления каждого контракта на обслуживание, который должен быть выставлен, и изменение значения по умолчанию RegisterRoutes на:

private void RegisterRoutes()
{
    // `TypeHelper.GetTypes().FilterTypes<T>` will find all of the types in the
    // current AppDomain that:
    // - Implement T if T is an interface
    // - Are decorated with T if T is an attribute
    // - Are children of T if T is anything else
    foreach (var type in TypeHelper.GetTypes()
                                   .FilterTypes<ServiceRouteAttribute>())
    {
        // routeAttrs should never be null or empty because only types decorated
        // with `ServiceRouteAttribute` should ever get here.
        // `GetAttribute<T>` is my extension method for `MemberInfo` which returns all
        // decorations of `type` that are T or children of T
        var routeAttrs = type.GetAttributes<ServiceRouteAttribute>();

        foreach (var routeAttr in routeAttrs)
        {
            // Some dupe and error checking

            var routePrefix = routeAttr.RoutePrefix;
            if (string.IsNullOrEmpty(routePrefix))
                routePrefix = type.Name;

            RouteTable.Routes.Add(new ServiceRoute(routePrefix, 
                                                   routeAttr.ServiceFactory,
                                                   type));
        }
    }
}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...