.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/

 聲明:本博客原創文字只表明本人工做中在某一時間內總結的觀點或結論,與本人所在單位沒有直接利益關係。非商業,未受權,貼子請以現狀保留,轉載時必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。

若是你們感受個人博文對你們有幫助,請推薦支持一把,給我寫做的動力。

相關文章
相關標籤/搜索