博客
关于我
Nancy之基于Nancy.Hosting.Aspnet的小Demo
阅读量:792 次
发布时间:2023-02-14

本文共 6063 字,大约阅读时间需要 20 分钟。

Nancy框架入门与电影管理系统开发实例

近年来,Nancy框架在.NET和Mono开发领域逐渐崭露头角。作为一名刚接触Nancy开发的新手,我在这里尝试记录下自己的学习历程,分享一个基于Nancy框架构建的简易电影管理系统的开发过程。


一、新建项目

通过VS2015创建一个新的空ASP.NET项目,初始状态下项目看起来还是相当基础。为了便于后续开发,我直接复制了一个MVC项目的基本模板,包括页面布局和样本视图。


二、安装Nancy相关组件

通过NuGet安装必要的Nancy组件:

  • Nancy
  • Nancy.Hosting.Aspnet
  • Nancy.Viewengines.Razor(选择Razor视图引擎)

在安装Razor后,默认会引用Microsoft.AspNet.Razor。为了使用最新版本,我手动更新至Razor 3.2.3。

此外,为了数据库操作,我还安装了Dapper ORM,以简化数据库调用。


三、项目结构优化

为便于开发,按照MVC项目的标准结构进行组织:

  • Modules:存放控制器类(类似MVC的Controller)
  • Models:存放数据模型
  • ViewModels:存放视图模型
  • Views:存放视图页面

在Views文件夹下新建布局页 _Layout.cshtml,并复制并修改自MVC项目的模板。为了方便后续开发,直接使用Razor引擎。


四、开发核心模块

1. 创建Home控制器

在Modules文件夹下新建HomeModule.cs,定义路由:

public class HomeModule : NancyModule{    public HomeModule() : base("/home")    {        Get["/"] = _ => ShowHomePage();        Get["/home/about"] = _ => ShowAboutPage();        Get["/home/contact"] = _ => ShowContactPage();    }    private dynamic ShowHomePage() => View["Index"];    private dynamic ShowAboutPage() => View["About"];    private dynamic ShowContactPage() => View["Contact"];}

2. 定义模型

在Models文件夹下创建两个类:

public class Movie{    public int MovieId { get; set; }    public string MovieName { get; set; }    public int MovieTypeId { get; set; }    public DateTime MovieAddTime { get; set; }    public MovieType MovieType { get; set; }    public Movie()    {        MovieAddTime = DateTime.Now;    }}public class MovieType{    public MovieType()    {        Movies = new HashSet
(); } public int TypeId { get; set; } public string TypeName { get; set; } public virtual ICollection
Movies { get; set; }}

3. 创建视图模型

在ViewModels文件夹下创建两个类:

public class MovieViewModel{    public int MovieId { get; set; }    public string MovieName { get; set; }    public int MovieTypeId { get; set; }    public string MovieTypeName { get; set; }    public DateTime MovieAddTime { get; set; }}public class MovieListViewModel{    public IEnumerable
Movies { get; set; }}

五、数据库操作与数据绑定

为了实现数据持久化,我使用了Dapper ORM,并创建了相应的存储过程。通过修改MovieModule.cs,实现了电影的增删改查功能。以下是核心代码:

public class MovieModule : NancyModule{    public MovieModule() : base("/movie")    {        Get["/"] = _ => ShowMovieIndexPage();        Get["/edit/{movieId}"] = _ => ShowMovieEditPage(_.movieId);        Post["/edit/{movieId}"] = _ =>        {            var movie = this.Bind
(); return MovieEdit(movie); }; Get["/create"] = _ => ShowMovieCreatePage(); Post["/create"] = _ => { var movie = this.Bind
(); return MovieCreate(movie); }; Get["/delete/{movieId}"] = _ => MovieDelete(_.movieId); } private readonly string _sqlConnection = "Data Source=192.168.0.71;Initial Catalog=NancyDemo;User Id=sa;Password=dream_time1314;"; public SqlConnection OpenConnection() => new SqlConnection(_sqlConnection); private dynamic MovieDelete(int movieId) { string deleteMovieStoredProcedure = @"up_DeleteMovieByMovieId"; using (SqlConnection conn = OpenConnection()) { conn.Execute(deleteMovieStoredProcedure, new { @MovieId = movieId }, null, null, CommandType.StoredProcedure); return Response.AsRedirect("/movie"); } } private dynamic MovieCreate(Movie movie) { string createMovieStoredProcedure = @"up_InsertMovie"; using (SqlConnection conn = OpenConnection()) { conn.Execute(createMovieStoredProcedure, new { @MovieName = movie.MovieName, @MovieTypeId = movie.MovieTypeId, @MovieAddTime = movie.MovieAddTime }, null, null, CommandType.StoredProcedure); return Response.AsRedirect("/movie"); } } private dynamic MovieEdit(Movie movie) { string updateMovieStoredProcedure = @"up_UpdateMovieByMovieId"; using (SqlConnection conn = OpenConnection()) { conn.Execute(updateMovieStoredProcedure, new { @MovieId = movie.MovieId, @MovieName = movie.MovieName, @MovieTypeId = movie.MovieTypeId }, null, null, CommandType.StoredProcedure); return Response.AsRedirect("/movie"); } } private dynamic ShowMovieCreatePage() { string getALLTypeStoredProcedure = @"up_GetAllMovieTypes"; using (SqlConnection conn = OpenConnection()) { MovieTypeListViewModel viewModel = new MovieTypeListViewModel { MovieTypes = conn.Query
(getALLTypeStoredProcedure, null, null, true, null, CommandType.StoredProcedure) }; return View["Create", viewModel]; } } private dynamic ShowMovieEditPage(int movieId) { string getOneMovieStoredProcedure = @"up_GetMovieByMovieId"; string getALLTypeStoredProcedure = @"up_GetAllMovieTypes"; DynamicParameters dynamicParameters = new DynamicParameters(); dynamicParameters.Add("@MovieId", movieId); using (SqlConnection conn = OpenConnection()) { var movieViewModel = conn.Query
(getOneMovieStoredProcedure, dynamicParameters, null, true, null, CommandType.StoredProcedure).SingleOrDefault(); ViewBag.typeList = conn.Query
(getALLTypeStoredProcedure, null, null, true, null, CommandType.StoredProcedure); return View["Edit", movieViewModel]; } } private dynamic ShowMovieIndexPage() { using (SqlConnection conn = OpenConnection()) { MovieListViewModel viewModel = new MovieListViewModel { Movies = conn.Query
(@"up_GetAllMovies", null, null, true, null, CommandType.StoredProcedure) }; return View["Index", viewModel]; } }}

六、视图开发

在Views文件夹下创建相应的视图:

  • Index.cshtml:显示电影列表
  • Edit.cshtml:修改电影信息
  • Create.cshtml:添加新电影
  • About.cshtml:关于我们
  • Contact.cshtml:联系我们

通过模型绑定(Nancy.ModelBinding)实现数据的自动绑定,简化了代码。


七、部署

将开发好的项目部署到Linux环境中。推荐使用CentOS 6.7 + Mono 4.2.2 + Jexus 5.8.0。部署步骤如下:

  • 将发布目录上传至 /var/www/
  • /usr/jexus/siteconf 下新建配置文件
  • 重新启动Jexus服务

  • 八、总结

    通过本文的实例,可以看出Nancy框架的灵活性和高效性。虽然初期学习曲线较陡,但随着熟悉程度的提升,开发效率显著提升。未来,我将深入研究Nancy的高级功能,如依赖注入和中间件,探索更多可能性。

    转载地址:http://azcfk.baihongyu.com/

    你可能感兴趣的文章
    Nacos配置中心中配置文件的创建、微服务读取nacos配置中心
    查看>>
    Nacos配置中心集群原理及源码分析
    查看>>
    nacos配置在代码中如何引用
    查看>>
    nacos配置新增不成功
    查看>>
    nacos配置自动刷新源码解析
    查看>>
    nacos集成分布式事务插件Seata的序列化问题,实际上是Seata本身存在bug!!
    查看>>
    Nacos集群搭建
    查看>>
    nacos集群搭建
    查看>>
    nacos集群网络分区对的影响和运维方式
    查看>>
    nacos集群节点故障对应用的影响以及应急方法
    查看>>
    nacos集群配置详解
    查看>>
    Nagios 3.0 Jumpstart Guide For Linux – Overview, Installation and Configuration
    查看>>
    nagios 实时监控 iptables 状态
    查看>>
    WAP短信格式解析及在Linux下用C语言实现
    查看>>
    nagios+cacti整合
    查看>>
    Nagios介绍
    查看>>
    nagios利用NSCient监控远程window主机
    查看>>
    nagios安装文档
    查看>>
    nagios服务端安装
    查看>>
    Nagios自定义监控脚本
    查看>>