【发布时间】:2012-05-15 19:13:05
【问题描述】:
是否有任何 MVC 框架将 POCO 概念应用于控制器?
示例:
假设我不想让我的控制器依赖于任何 Web 框架,因为我不再需要从框架 Controller 类继承。
相反,我只想用一些规则指定路由,描述如何将请求映射到我的 POCO 控制器类实例的方法和参数。
也许下面的小例子可以更好地解释它。
想象一下我们可以有这样的路由:
routes.MapPOCOController<MyPOCO>("MyWebAppName/{method}/{*parameters}", () => _container.Resolve<MyPOCO>());
routes.IfMethodReturns<MyCustomRedirectResult>().PerformRedirect(result => result.Url);
然后你的控制器类只是一个 POCO 对象:
public class MyPOCO {
public User GetUser(Guid userId) {...}
public string Home() {
return _razorEngine.Render("~/Views/Home/Index.cshtml", new HomeModel { Message = "Hello world!"});
}
public object RenderSomePageOrRedirect()
{
if(blabla)
return new MyCustomRedirectResult("/profile");
else
return _razorEngine.Render( ... );
}
...
}
- 在第一种方法中,“GetUser”JSON 序列化可能会像在 mvc4 中一样自动发生。
- 在第二种方法“Home”中,我们需要手动将视图呈现为字符串,因此这将为您提供更大的灵活性,例如组合不同的引擎或以比当前 asp.mvc 更自然的方式编写自定义引擎实施。
- 在第三种方法“RenderSomePageOrRedirect”中,我们对当前的 RedirectResult 实现并不严格,可以使用任何有效的类,然后将其正确映射到路由中。
是否有任何框架已经实现了至少一个提到的概念? ...也许是一些“contrib”库?
我寻找这种功能的原因是:
- 我想遵循 DRY 原则,不想将请求/响应映射代码与控制器中的业务逻辑混在一起(我知道当前的 mvc 实现不能同时使用这两种代码)
- 我想让我的控制器类在多个上下文中可用,因此,它更容易进行单元测试、重用等。 (当您在不同的 Web 应用程序中重用相同的控制器时,代码会变得更加 DRY:您只需稍微调整一下路由)
- 只是直觉感觉这种做事方式更好,抱歉,我的文字渲染器放弃了(
PS:我感谢那些在下面评论并帮助我正确形成这个问题的人(尤其是 StriplingWarrior)!
【问题讨论】:
-
在没有框架与 Web 服务器交互的情况下,您将如何托管控制器等?
-
那么您想创建自己的 MVC 框架吗?
-
@ILICH:好吧,我想说框架控制器引用的适当抽象的业务层和一些明智的路由可以解决您的问题,而无需重新发明一个合理可靠的轮子。
-
@ILCH:您能否提供一个代码示例来说明您希望这样的控制器如何工作?例如,如果您希望您的控制器兼作服务,那么它的操作会返回什么类型的对象?在 MVC 模式与服务模式下,这些对象将如何呈现?我认为这个问题背后的想法有一些优点,但就目前而言,你没有用足够的细节解释你的意图来产生一个体面的答案。
-
@ILCH:代码不足以充实您的问题。
MyService会是什么样子?它的动作会返回什么样的结果?您希望MyService有效地兼作控制器和服务,对吗?如果是这样,将对其方法的返回类型执行什么样的转换以使其可在视图中呈现?如果您希望其他人认真对待您的问题,则需要表明您已经认真考虑过。
标签: asp.net-mvc asp.net-mvc-routing poco fluent-interface