博客
关于我
Nancy之基于Nancy.Hosting.Aspnet的小Demo
阅读量:794 次
发布时间: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/

    你可能感兴趣的文章
    m个苹果放入n个盘子问题
    查看>>
    n = 3 , while n , continue
    查看>>
    n 叉树后序遍历转换为链表问题的深入探讨
    查看>>
    N!
    查看>>
    N-Gram的基本原理
    查看>>
    n1 c语言程序,全国青少年软件编程等级考试C语言经典程序题10道七
    查看>>
    Nacos Client常用配置
    查看>>
    nacos config
    查看>>
    Nacos Config--服务配置
    查看>>
    Nacos Derby 远程命令执行漏洞(QVD-2024-26473)
    查看>>
    Nacos 与 Eureka、Zookeeper 和 Consul 等其他注册中心的区别
    查看>>
    Nacos 单机集群搭建及常用生产环境配置 | Spring Cloud 3
    查看>>
    Nacos 启动报错[db-load-error]load jdbc.properties error
    查看>>
    Nacos 注册服务源码分析
    查看>>
    Nacos 融合 Spring Cloud,成为注册配置中心
    查看>>
    Nacos-注册中心
    查看>>
    Nacos2.X 源码分析:为订阅方推送、服务健康检查、集群数据同步、grpc客户端服务端初始化
    查看>>
    Nacos2.X 配置中心源码分析:客户端如何拉取配置、服务端配置发布客户端监听机制
    查看>>
    Nacos2.X源码分析:服务注册、服务发现流程
    查看>>
    NacosClient客户端搭建,微服务注册进nacos
    查看>>