NancyFx 2.0的开源框架的使用-CustomModule(自定义模块)
NancyFx框架的自定义模块
新建一个空的Web项目

然后通过NuGet库安装下面的包
- Nancy
- Nancy.Hosting.Aspnet

然后添加Models,Module,Views三个文件夹,并在Models文件里面添加NancyRouteAttribute类
//路由的方法
public string Method { get; set; }
//路由的路径
public string Path { get; set; }
public NancyRouteAttribute(string method,string path)
{
this.Method = method;
this.Path = path;
}

然后在Module文件夹添加UglifiedNancyModule类
//使用的自定义 INancyModule 实现
//方法的属性(eugh!) 来定义路由。
//没有人在他们正确的头脑将编写一个网络框架
//使用属性进行路由的;
public AfterPipeline After { get; set; }
public BeforePipeline Before { get; set; }
public ErrorPipeline OnError { get; set; }
public NancyContext Context { get; set; }
public IResponseFormatter Response { get; set; }
public IModelBinderLocator ModelBinderLocator { get; set; }
public ModelValidationResult ModelValidationoResult { get; set; }
public IModelValidatorLocator ValidatorLocator { get; set; }
public Request Request { get; set; }
public IViewFactory ViewFactory { get; set; }
public string ModulePath { get; set; }
public ViewRenderer View { get { return new ViewRenderer(this); } }
public Negotiator Negotiate { get { return new Negotiator(this.Context); } }
public UglifiedNancyModule():this(string.Empty)
{ }
public IEnumerable<Route> Routes
{
get { return this.GetRoutes(); }
}
public dynamic Text { get; set; }
private UglifiedNancyModule(string modulePath)
{
this.After = new AfterPipeline();
this.Before = new BeforePipeline();
this.OnError = new ErrorPipeline();
this.ModulePath = modulePath;
}
//在类上运行所有方法
//为我们的属性。如果我们是为了一个真实的
//我们将检查参数和返回类型等
private IEnumerable<Route> GetRoutes()
{
var routes = new List<Route>();
var type = this.GetType();
var methods = type.GetMethods(BindingFlags.Instance|BindingFlags.Public);
foreach (var method in methods)
{
var attribute = method.GetCustomAttributes(typeof(NancyRouteAttribute),false).FirstOrDefault() as NancyRouteAttribute;
if (attribute==null)
{
continue;
}
var routeDelegate = WrapFunc((Func<dynamic,dynamic>)Delegate.CreateDelegate(typeof(Func<dynamic,dynamic>),this,method.Name));
var filter = this.GetFilter(method.Name);
var fullPath = string.Concat(this.ModulePath,attribute.Path);
routes.Add(new Route<object> (attribute.Method.ToUpper(),fullPath,filter,routeDelegate));
}
return routes.AsReadOnly();
} //在返回任务的委托中包装同步委托
private Func<NancyContext, bool> GetFilter(string routeMethodName)
{
var type = this.GetType();
var method = type.GetMethod(routeMethodName+"Filter",BindingFlags.Public|BindingFlags.Instance);
if (method==null)
{
return null;
}
return (Func<NancyContext,bool>)Delegate.CreateDelegate(typeof(Func<NancyContext,bool>,this,method.Name));
}
private static Func<dynamic,CancellationToken,Task<dynamic>> WrapFunc(Func<object,object> syncFunc)
{
return(p,ct) =>
{
var tcs = new TaskCompletionSource<dynamic>();
try
{
var result = syncFunc.Invoke(p);
tcs.SetResult(result);
}
catch (Exception e)
{
tcs.SetException(e);
//throw;
}
return tcs.Task;
};
}

继续在Module文件夹添加MainModule类
[NancyRoute("GET", "/")]
public dynamic Root(dynamic parameters)
{
return View["Index", new { Name = "Lexan!" }];
}
public bool FilteredFilter(NancyContext context)
{
return false;
}
[NancyRoute("GET", "/filtered")]
public dynamic Filtered(dynamic parameters)
{
return "筛选";
}

然后往根目录添加Bootstrapper类
public override void Configure(INancyEnvironment environment)
{
//base.Configure(environment);
environment.Diagnostics(enabled:true,password:"password");
}

继续往根目录添加SharedAssemblyInfo类
using System.Runtime.InteropServices;
using System.Reflection; [assembly:AssemblyInformationalVersion("2.0.0-alpha")]

继续往Views文件夹里面添加index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>你好!</title>
</head>
<body>
<h1>你好 @Model.Name 这是使用自定义模块类型实现的</h1>
</body>
</html>

然后看看运行结果

谢谢欣赏!
NancyFx 2.0的开源框架的使用-CustomModule(自定义模块)的更多相关文章
- NancyFx 2.0的开源框架的使用-Basic
这是NancyFx开源框架中的Basic认证,学习一下! 首先当然是新建一个空的Web,BasicDemo 继续在项目中添加Nuget包,记得安装的Nuget包是最新的预发行版 Nancy Nancy ...
- NancyFx 2.0的开源框架的使用-ModelBinding(实现绑定)
NancyFx框架中使用绑定模型 新建一个空的Web程序 然后安装Nuget库里面的包 Nancy Nancy.Hosting.Aspnet Nancy.ViewEnglines.Spark 并在We ...
- NancyFx 2.0的开源框架的使用-HosingOwin
Nancy框架的Owin使用 先建一个空的Web项目 然后往Nuget库里面添加Nancy包 Nancy Nancy.Owin Nancy.ViewEnglines.Spark 然后添加Models, ...
- NancyFx 2.0的开源框架的使用-Authentication
新建一个空的项目 新建好了空的项目以后,接着通过NuGet安装一下三个包 Nancy Nancy.Hosting.Aspnet Nancy.ViewEnglines.Razor 然后在项目中添加Mod ...
- NancyFx 2.0的开源框架的使用-Forms
同样的像前面2篇博文一样,每个项目的开始基本都是建个空的Web项目 在NuGet库中安装以下几个NuGet包 Nancy Nancy.Authentication.Forms Nancy.Hostin ...
- NancyFx 2.0的开源框架的使用-Stateless
同样和前面一样新建一个空的Web项目,都在根目录添加Module,Models,Views文件夹 添加Nuget包 在Models文件夹里面添加UserModel类 public string Use ...
- NancyFx 2.0的开源框架的使用-Stateless(二)
继续上一篇Stateless的博文,在上一篇的博文的基础上稍微加点东西 接下来右键解决方案添加新项目,一样建一个空的Web项目 然后在StatelessDemoWeb项目里面添加Views文件夹,Sc ...
- NancyFx 2.0的开源框架的使用-AspnetBootstrapping
新建一个空的Web项目AspnetBootstrappingDemo 然后添加NuGet组件 Nancy Nancy.Hosting.Aspnet Nancy.ViewEngines.Razor 继续 ...
- NancyFx 2.0的开源框架的使用-Caching
新建一个空的Web项目,命名CachingDemo 然后添加三个Nuget安装包 Nancy Nancy.Hosting.Aspnet Nancy.ViewsEngines.Razor 然后往项目里面 ...
随机推荐
- JavaWeb之cookie
什么叫做会话 ? 用户从打开一个浏览器开始,浏览器网站,到关闭浏览器的整个过程叫做一次会话! 每个用户与服务器进行交互的过程中,各自会有一些数据,程序要想办法保存每个用户的数据. 例如:用户点击超链接 ...
- sublimeText3插件安装
1,官方下载sublimeText 3(百度搜索) 2,安装成功后按Ctrl+`调出console 3,然后输入 import urllib.request,os; pf = 'Package Con ...
- Springboot在IDEA中执行,开启热部署
仅适用IDEA中,eclipse中不需要设置 一.开启idea自动make功能 1 - Enable Automake from the compiler PRESS: CTRL + SHIFT + ...
- JavaWeb总结(六)—Session
一.Session的介绍 在Web开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务器 ...
- ios坐标位置转换
//ios常用坐标转换来处理一些下拉框队形的按钮的位置,我以最下面两个来进行一下个人的理解,不足之处多多见谅 - (CGPoint)convertPoint:(CGPoint)point toView ...
- ios deprecated 警告消除 强迫症的选择
#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" ...
- DIV+CSS清除浮动方法
一.为什么要清除浮动? 1>父元素在未定义高的情况下,由于子元素全部浮动脱离文本流,而造成父元素高的塌陷(正常情况下,父元素的高是由未浮动的子元素撑起来) 2>因为部分子元素的而浮动,脱离 ...
- 使用WebView监控网页加载状况,PerformanceMonitor,WebViewClient生命周期
原理:WebView加载Url完成后,注入js脚本,脚本代码使用W3C的PerformanceTimingAPI, 往js脚本传入一个Android对象(代码中为AndroidObject),在js脚 ...
- NOIP2014D2T2寻找道路
洛谷传送门 这道题可以把边都反着存一遍,从终点开始深搜,然后把到不了的点 和它们所指向的点都去掉. 最后在剩余的点里跑一遍spfa就可以了. --代码 #include <cstdio> ...
- http协议的八种请求类型
GET:向特定的资源发出请求. POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件).数据被包含在请求体中.POST请求可能会导致新的资源的创建和/或已有资源的修改. OPTIONS: ...