【问题标题】:Asp.net MVC - Asynch controller get functionality from my base controllerAsp.net MVC - 异步控制器从我的基本控制器获取功能
【发布时间】:2011-04-06 19:48:15
【问题描述】:

我有一个基础控制器,它是标准 mvc 控制器的子类。这包含了许多特定于控制器的有用方法。

我现在需要在我的一个新控制器中添加一些异步功能

但是,要做到这一点,您需要创建一个子类 AsyncController 的控制器

但我也想访问我的基本控制器中的功能

显然多重继承是不可能的

那么我该如何解决这个问题?

【问题讨论】:

    标签: asp.net asp.net-mvc-3 asynchronous subclass oop


    【解决方案1】:

    您可以将您愿意重用的功能外部化到服务层、操作过滤器、授权过滤器、模型绑定器……这取决于您愿意重用的功能,以便您可以轻松切换基本控制器到异步控制器并仍然保留功能。如果你想使用异步控制器,你需要从 AsyncController 派生。

    【讨论】:

    • 假设为了论证,我想要基本控制器中可用的所有功能,并且基本控制器似乎是该功能存在的正确位置。强迫您对特定控制器进行子类化以使其异步化似乎是一个奇怪的决定。它强制脆弱/重复的继承层次结构 - 除非我遗漏了什么。 (这当然不是闻所未闻的)
    • @josedelascasa,不,你没有错过任何东西。这是框架的设计者决定实现这一点的方式。有一些批评者反对他们使用抽象类而不是接口这一事实,但事实就是如此,我们对此无能为力。
    【解决方案2】:

    你可以让你的控制器类继承IAsyncManagerContainerIAsyncController,然后自己实现这个功能,也许使用MVC源代码中的代码。您甚至可以将其封装在您将功能委托给它自己的类中。

    【讨论】:

    • 是的,这不是一个坏主意。我在考虑这个问题 - 手动实现 Icontroller。但是按照自己的方式来做会少一些工作。谢谢 - 暂时将这个问题留给其他建议
    • 但仍然需要为每个需要异步功能的控制器重复此操作
    • @josedelascasa - 这就是为什么我建议将代码封装在它自己的类中,然后委派调用。您必须手动实现每个控制器的方法,但这只是一些样板代码的问题。你甚至可以使用代码 sn-ps 来自动化它。
    • 啊,是的,明白了。有兴趣听听其他方法。恕我直言,这似乎是一个非常糟糕的设计缺陷(即继承)
    • @josedelascasa - 您还可以创建一个从实现异步接口的基类继承的基类。缺乏多重继承通常被认为是一个特性,因为 MI 很难正确执行,并且给系统增加了大量的复杂性。多接口继承通常就足够了。
    猜你喜欢
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2012-07-05
    • 1970-01-01
    相关资源
    最近更新 更多