.NET轻量级MVC框架:Nancy入门教程(二)——Nancy和MVC的简单对比

  在上一篇的.NET轻量级MVC框架:Nancy入门教程(一)——初识Nancy中,简单介绍了Nancy,并写了一个Hello,world。看到你们的评论,都在问Nancy的优点在哪里?和微软的MVC比有什么不一样,哪一个更好?Nancy是否能够脱离IIS等等,那么今天就拿MVC和Nancy作个简单的对比吧!首先说一点,我对MVC研究并不深刻,若有没说到或说错的地方,还请你们补充和纠正。html

下面纠正一个问题,Nancy官网并无明确的说Nancy是一个MVC框架,官方的定义是:Nancy是一个用于构建基于HTTP 的Web服务的框架。我题目中所写的轻量级MVC框架有些不妥之处,可是可让你们快速的对Nancy有个大体的了解。不过,说实话,Nancy和asp.net在一块儿,实在是太像MVC了。git

今天主要讲理论的东西,不写代码,文章中所提到的配置,只是为了帮助理解,详细配置和操做内容还请参考官方帮助文档。github

 

 1、Hosting Of Nancy

 一、Hosting Nancy with asp.netweb

方案一:整站都使用Nancy框架

  在ASP.NET中,Nancy经过设置web.config,使用HTTP handler来处理请求。若是你在Visual Studio中使用了Nancy的模板来建立,就会自动生成webconfig配置,不然就要添加以下配置到webconfig中:asp.net

<system.web>
  <compilation debug="true" targetFramework="4.0" />
  <httpHandlers>
    <add verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" path="*"/>
  </httpHandlers>
</system.web>

<system.webServer>
  <modules runAllManagedModulesForAllRequests="true"/>
  <validation validateIntegratedModeConfiguration="false"/>
  <handlers>
    <add name="Nancy" verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" path="*"/>
  </handlers>
</system.webServer>

而且还要肯定你添加了Nancy和Nancy.Hosting.Aspnet 两个dll的引用。异步

 

方案二:网站中一部分使用Nancyasync

除了使用Nancy搭建整个网站,咱们还能够在已存在的网站中使用Nancy来处理某些特定路径的请求。例如咱们要处理nancypath下面的全部请求,咱们只须要修改上面的配置NancyHttpRequestHandler的path为path="nancypath/*",而且你也要在项目中添加指定路径的文件夹,并在文件夹内放入以下Web.config:ide

<?xml version="1.0"?>
<configuration>
  <system.web>
    <httpHandlers>
      <add verb="*" type="Nancy.Hosting.Aspnet.NancyHttpRequestHandler" path="*"/>
    </httpHandlers>
  </system.web>
</configuration>

除此以外,再修改webconfig中的<location>节点配置。post

 

方案三:在MVC中使用Nancy

是的,你没有看错,Nancy和MVC一块儿使用,若是要在MVC中使用Nancy,须要修改Global.asax.cs文件,添加以下内容:

routes.IgnoreRoute("nancy/{*pathInfo}");

这个时候,全部访问nancy目录的请求,就都会被Nancy处理了,接下来,咱们就能够这样写代码了,例如:

public class Home : NancyModule
{
   public Home()
   {
      Get["/nancy/products"] = x => "The products!";
   }
}

 这部分详细内容参考:https://github.com/NancyFx/Nancy/wiki/Hosting-Nancy-with-asp.net

 

2.Hosting Nancy with wcf

  若是你想搭建一个轻量级的HTTP服务而又不想使用IIS,Nancy是一个很好的选择,你能够按照下面的操做来实现:

首先,安装Nancy.Hosting.Wcf,Nugget代码以下:

PM> Install-Package Nancy.Hosting.Wcf

而后,编写代码,以下:

var host = new WebServiceHost(new NancyWcfGenericService(),
                              new Uri("http://localhost:1234/base/"));
host.AddServiceEndpoint(typeof (NancyWcfGenericService), new WebHttpBinding(), "");
host.Open();

// Nancy will now handle requests to http://localhost:1234/base/

 而后,Nancy就会侦听本地的1234端口,处理HTTP请求。

 这部分详细内容参考:https://github.com/NancyFx/Nancy/wiki/Hosting-Nancy-with-wcf

 

除此以外,Nancy还有如下Host方式:

Hosting-nancy-with-azure              参考:https://github.com/NancyFx/Nancy/wiki/Hosting-nancy-with-azure

Hosting-nancy-with-owin               参考:https://github.com/NancyFx/Nancy/wiki/Hosting-nancy-with-owin

Hosting-Nancy-with-Umbraco        参考:https://github.com/NancyFx/Nancy/wiki/Hosting-Nancy-with-Umbraco

Hosting-Nancy-with-Nginx-on-Ubuntu     参考:https://github.com/NancyFx/Nancy/wiki/Hosting-Nancy-with-Nginx-on-Ubuntu

Hosting-Nancy-with-FastCgi         参考:https://github.com/NancyFx/Nancy/wiki/Hosting-Nancy-with-FastCgi

Self-Hosting-Nancy              参考:https://github.com/NancyFx/Nancy/wiki/Self-Hosting-Nancy

 

 2、MVC和Nancy中的路由对比

 一、Nancy中的路由机制

在上一篇的博文中,咱们都知道Nancy中的全部路由都定义在module中的构造方法中,咱们上次定义了一个无参路由,以下:

public class HelloModule : NancyModule
{
    public HelloModule()
    {
        Get["/"] = parameters => "Hello World";
    }
}

Nancy中有参路由能够这样定义:

public class ProductsModule : NancyModule
{
    public ProductsModule()
    {
        Get["/products/{id}"] = _ =>
        {
            //do something
        };
    }
}

或者定义成异步的,以下:

public class ProductsModule : NancyModule
{
    public ProductsModule()
    {
        Get["/products/{id}", runAsync: true] = async (_, token) =>
        {
            //do something long and tedious
        };
    }
}

Nancy中支持的method有:DELETEGETHEADOPTIONSPOSTPUT and PATCH

固然,Nancy中还支持路由参数约束,例如咱们要求参数必须为int类型,咱们能够这样定义:

Get["/intConstraint/{value:int}"] = _ => "Value " + _.value + " is an integer.";

除了int类型,Nancy还支持如下类型的约束:

感受还不够?Nancy还提供了自定义参数约束,好比咱们要求参数是一个email,咱们能够先定义以下类:

public class EmailRouteSegmentConstraint : RouteSegmentConstraintBase<string>
{
    public override string Name
    {
        get { return "email"; }
    }

    protected override bool TryMatch(string constraint, string segment, out string matchedValue)
    {
        if (segment.Contains("@"))
        {
            matchedValue = segment;
            return true;
        }

        matchedValue = null;
        return false;
    }
}

而后,定义路由以下:

Get["/profile/{value:email}"] = _ => "Value " + _.value + " is an e-mail address.";

下面是Nancy中路由经常使用的几种写法:

 固然,Nancy的路由机制很是强大、很是灵活,那么当一个地址能够匹配多个路由时,Nancy会选择哪个呢?其实,Nancy中有一套路由的权重机制来解决路由冲突,这个到后面说路由的时候会详细说的。

 

二、MVC中的路由机制

咱们都知道MVC中的路由配置都在 Global.asax.cs中,当一个ASP.NET MVC应用程序第一次运行时, Application_Start()方法被调用。这个方法,又调用RegisterRoutes()方法,RegisterRoutes()方法建立了路由表。

MVC中的默认路由以下:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
 
    routes.MapRoute( 
        "Default", // 路由名称 
        "{controller}/{action}/{id}", // 带有参数的 URL 
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值 (UrlParameter.Optional-可选的意思)
    ); 
  }

NVC中无参路由定义以下:

routes.MapRoute
(
    "Home", 
    "{controller}/{action}/{id}"
);

MVC中带命名空间的路由定义以下:

 routes.MapRoute(
      "AdminControllers", // 路由名称
      "{controller}/{id}-{action}", // 带有参数的 URL
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // 参数默认值
      new string[] { "Admin.Controllers" }//命名空间
  );

MVC中带约束的路由定义以下:

routes.MapRoute(
    "RuleControllers",
    "{controller}/{action}-{Year}-{Month}-{Day}}",
    new { controller = "Home", action = "Index", Year = "2014", Month = "12", Day = "08" },
    new { Year = @"^\d{4}", Month = @"\d{2}" } //4位数 2位数
);

MVC全局路由:

  routes.MapRoute(
        "All", // 路由名称
        "{*Vauler}", // 带有参数的 URL
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
    );

 

综上所述,MVC和Nancy的路由机制从功能上来讲不相上下,MVC有的Nancy也有。不过,相比之下,Nancy中的路由更加简单、灵活,毕竟MVC中的路由对于新手来讲不是那么容易掌握的。

 

 3、MVC和Nancy中的视图的对比

   固然,视图这块你们仍是比较关注的。下面简单对比MVC和Nancy所支持的视图:

                                       MVC                                                                             Nancy                                             
                                           WebForm                                                                   支持                               支持
                                           Razor                                支持                               支持

 这里咱们看到MVC和nancy都支持WebForm和Razor视图。而且,Nancy在Razor视图中也支持Model的绑定和部分视图,在Nancy中的部分视图中,也可使用Modle绑定。

  

 4、关于跨平台

  虽然微软刚刚宣布开源不久,可是在这以前,asp.net就能够经过Mono实现跨平台了。固然MVC和Nancy也能够经过Mono来实现跨平台。

 

到这里,对在上一篇中所提到的问题,相信你们心中已经有答案了吧~~ 

 

 做者:雲霏霏

QQ交流群:243633526

 博客地址:http://www.cnblogs.com/yunfeifei/

 声明:本博客原创文字只表明本人工做中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未受权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文链接。

若是你们感受个人博文对你们有帮助,请推荐支持一把,给我写做的动力。

相关文章
相关标签/搜索