Есть ли обходной путь для интерфейсов композиции и маркера?

Я часто вижу, что сталкиваюсь со следующей проблемой. У меня есть некоторый интерфейс Marker Interface (для простоты давайте используем java.io.Serializable ) и несколько оболочек (Adapter, Decorator, Proxy, ...). Но когда вы оборачиваете экземпляр Serializable в другой экземпляр (который не сериализуем), вы теряете функциональность. Та же проблема возникает с java.util.RandomAccess, который может быть реализован реализациями List. NET MVC - используйте Reflection, чтобы найти, существует ли контроллер У меня чертовски много времени выясняется, как правильно реализовать перенаправление 404. Если я использую следующее _ Открытый класс BaseController: Наследует System.Web.Mvc.Controller ...

У меня чертовски много времени выясняется, как правильно реализовать перенаправление 404.

Если я использую следующее

 _
Public Class BaseController : Inherits System.Web.Mvc.Controller
''# do stuff
End Class

, то любая необработанная ошибка на странице вызовет «Ошибка». вид, который прекрасно работает. http://example.com/user/999 (где 999 - недопустимый идентификатор пользователя) выдаст ошибку при сохранении исходного URL (это то, что я хочу)

Однако. Если кто-то вводит http://example.com/asdfjkl в URL (где asdfjkl - недопустимый контроллер), то IIS создает общую страницу 404. (это не , что я хочу). То, что мне нужно, это то же самое, что и выше. Исходный URL остается, а контроллер NotFound загружается.

I ' m регистрировать мои маршруты следующим образом

Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
    routes.RouteExistingFiles = False
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
    routes.IgnoreRoute("Assets/{*pathInfo}")
    routes.IgnoreRoute("{*robotstxt}", New With {.robotstxt = "(.*/)?robots.txt(/.*)?"})

    routes.AddCombresRoute("Combres")

    routes.MapRoute("Start", "", New With {.controller = "Events", .action = "Index"})

    ''# MapRoute allows for a dynamic UserDetails ID
    routes.MapRouteLowercase("UserProfile", "Users/{id}/{slug}", _
                             New With {.controller = "Users", .action = "Details", .slug = UrlParameter.Optional}, _
                             New With {.id = "\d+"} _
    )


    ''# Default Catch All MapRoute
    routes.MapRouteLowercase("Default", "{controller}/{action}/{id}/{slug}", _
                             New With {.controller = "Events", .action = "Index", .id = UrlParameter.Optional, .slug = UrlParameter.Optional}, _
                             New With {.controller = New ControllerExistsConstraint})

    ''# Catch everything else cuz they're 404 errors
    routes.MapRoute("CatchAll", "{*catchall}", _
                    New With {.Controller = "Error", .Action = "NotFound"})

End Sub

Обратите внимание на ControllerExistsConstraint ? Что мне нужно сделать, так это использовать Reflection, чтобы узнать, существует ли контроллер.

Кто-нибудь может мне помочь заполнить пробелы?

Public Class ControllerExistsConstraint : Implements IRouteConstraint

    Public Sub New()
    End Sub

    Public Function Match(ByVal httpContext As System.Web.HttpContextBase, ByVal route As System.Web.Routing.Route, ByVal parameterName As String, ByVal values As System.Web.Routing.RouteValueDictionary, ByVal routeDirection As System.Web.Routing.RouteDirection) As Boolean Implements System.Web.Routing.IRouteConstraint.Match


        ''# Bah, I can't figure out how to find if the controller exists


End Class

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

5
задан Chase Florell 14 August 2010 в 03:57
поделиться