1

我很想知道是否有更好的方法来实现以下内容。我不想创建复杂或不可维护的代码。

我正在创建一个将由未来项目实现的类库。该库包含几个过滤器/属性,继承自 ActionFilterAttribute,实现应用程序可以使用这些过滤器/属性来装饰控制器或操作。

一个例子是 MustBeLoggedInAttribute。这将检查 cookie 以查看当前用户是否已登录。如果存在有效的 cookie,则不采取任何操作。如果没有有效的 cookie,该属性将重定向到控制器和操作,例如 AuthController > Login()。

因此,由于有一个应用程序实现了类库,我不知道应用程序想要重定向到哪个控制器或操作。我想了两种获取这些信息的方法。

  1. 获取实现应用以在其 web.config 中指定控制器和操作名称。

    我通过检查它们是否都存在于实现应用程序的程序集中来验证字符串名称,否则尝试使用默认值,例如 Home > Index()。这种方法似乎有很多缺点,包括

    • 使实现应用程序的可维护性降低(更改控制器或操作名称也意味着更新 Web 配置)

    • 我必须验证字符串名称

    • 实现应用程序的开发人员需要阅读文档才能知道如何指定这一点

    • 可能还有更多

  2. 让过滤器/属性接受两个参数来指定控制器和操作

    这似乎也有第一个想法的一些缺陷,例如,如果名称被更改,则更新名称,以及名称将在整个实施应用程序中重复的事实。

我觉得必须有更好的方法来做到这一点,这将使实现应用程序可维护,不会重复代码,也不会太复杂。这是一厢情愿吗?

过滤器需要知道重定向到哪里,但是最好的方法是什么?或者我应该以完全不同的方式做到这一点?实现应用程序是否应该实现自己的过滤器/属性,然后使用我的类库中的公共方法进行 cookie 检查?有没有更好的方法?

我真的很感谢人们对此的想法,因为我真的不想创建糟糕的代码。非常感谢!

4

2 回答 2

2

您可以使您的操作过滤器抽象化,并使用一些 HandleUnauthorizedRequests 抽象方法来获取过滤器上下文。现在,实现应用程序将采用您的基本操作过滤器并编写一个实现抽象方法的派生过滤器,并改用此类。在这种方法中,它可以做任何它想做的事 -> 重定向,渲染视图,...

您当然可以使用标准的常规内容提供一些默认实现,例如重定向到帐户/登录操作。想要超越这些传统东西的人总是可以做到的。这样,作为类库作者的你就不用担心控制器是否存在——这是消费者的责任。

于 2013-10-15T12:01:53.607 回答
1

老问题,但这里有几个新选择:

使用您的选项 2,但不是单独应用于每个操作,而是创建一个基本控制器并将过滤器应用于该控制器。然后,该控制器和衍生产品中的所有操作都需要通过您的过滤器。将不需要传递的操作放入不是从过滤后的基本控制器派生的不同控制器中。根据您组织动作/路线等的方式,可能不是一个选项,但可能是最简单的。

或者,您可以让您的过滤器引发自定义异常,例如 MustBeLoggedInException,然后让您的全局 asax 以每个应用程序/实现所需的方式专门处理该错误。更好地遵守单一职责原则:您的属性只是通知您的应用程序它没有通过过滤器。然后,您使用一些其他机制来处理该信息(例如,全局错误处理程序中的重定向)。

于 2014-03-31T13:49:16.517 回答