OS : Windows 10 10.0.14393html
IDE : Visual Studio 2015 Community With Update 3web
Database : PostgreSQL 9.6sql
DBMS :pgAdmin 4数据库
MVC MusicStore中的数据分为两部分:系统相关数据和MemberShip产生的用户数据app
这里咱们只须要系统相关的数据,Membership相关的数据就让它见鬼去吧~~框架
系统相关的数据是存储在SQL Server Compact,经过Database4打开这个数据库,而后将这个数据库生成相关的脚本,对这些脚本简单的修改一下,拿到pg Admin 上执行。ide
而后还添加了一张新的用户表,建表语句以下ui
CREATE TABLE public.sysuser ( sysuserid character varying(100) COLLATE pg_catalog."default" NOT NULL, sysusername character varying(100) COLLATE pg_catalog."default" NOT NULL, sysuserpassword character varying(100) COLLATE pg_catalog."default" NOT NULL, sysuseremail character varying(100) COLLATE pg_catalog."default", CONSTRAINT sysuser_pkey PRIMARY KEY (sysuserid) ) WITH ( OIDS = FALSE ) TABLESPACE pg_default; ALTER TABLE public.sysuser OWNER to dev;
数据库和数据表已经建好了,下面还要配置PG能够被远程访问,否则后面在Linux部署的时候会提示没法访问数据库。spa
只须要修改 pg_hba.conf 这个配置文件3d
直接将host all all 127.0.0.1/32 md5
修改成如下配置 host all all 0.0.0.0/0 md5
若是不但愿容许全部IP远程访问,则能够将上述配置项中的0.0.0.0设定为特定的IP值。
新建一个空的Web项目,命名为NancyMusicStore,经过Nuget添加本实战用到的相关程序集。
在Package Manager Console窗口经过安装下面的package
Install-Package Nancy -Version 1.4.3 Install-Package Nancy.Hosting.Aspnet -Version 1.4.1 Install-Package Nancy.Viewengines.Razor -Version 1.4.3 Install-Package Nancy.Authentication.Forms -Version 1.4.1 Install-Package Dapper Install-Package Npgsql -Version 3.1.9
相关package说明:
Nancy 这个就不用说了,Nancy框架的根
Nancy.Hosting.Aspnet 项目基于ASP.NET的宿主环境的
Nancy.Viewengines.Razor 项目用到的模板引擎,也是咱们最熟悉的Razor
Nancy.Authentication.Forms 项目用到的身份认证组件,替代MVC MusicStore中的Membership
Dapper,轻量级ORM
Npgsql,访问pg的驱动
添加了很多有用的东西,天然也要干掉很多没有用的东西!!
移除掉没有用到的DLL引用,具体剩下的以下图所示:
能够看到引用十分简洁!
在项目新建两个文件夹,Content和Scripts,把需的资源文件从MVC MUSICSTORE中添加进来。
其中Content文件夹只须要下面的几个:
Scripts文件夹只须要下面两个:
本地的静态资源文件,不是简单的引用就可以使用的。还要在启动器中对静态资源文件的访问支持,若是不添加,资源文件就会报404的错误。
因此咱们要建个启动器类:CustomBootstrapper,具体内容以下:
using Nancy; using Nancy.Authentication.Forms; using Nancy.Bootstrapper; using Nancy.Conventions; using Nancy.Session; using Nancy.TinyIoc; using NancyMusicStore.Common; namespace NancyMusicStore { public class CustomBootstrapper : DefaultNancyBootstrapper { protected override void ApplicationStartup(TinyIoCContainer container,IPipelines pipelines) { //Prevent errors on Linux StaticConfiguration.DisableErrorTraces = false; } protected override void ConfigureApplicationContainer(TinyIoCContainer container) { base.ConfigureApplicationContainer(container); } protected override void ConfigureConventions(NancyConventions conventions) { base.ConfigureConventions(conventions); conventions.StaticContentsConventions.Add(StaticContentConventionBuilder.AddDirectory("Scripts")); conventions.StaticContentsConventions.Add(StaticContentConventionBuilder.AddDirectory("Content")); } } }
下面就创建相应的数据模型与数据库的表映射:
数据和模型都有了,下面就在web.config中添加pg的链接字符串:
<connectionStrings> <add name="pgsqlConn" connectionString="Host=127.0.0.1;Username=dev;Password=123456;Database=nancymusicstore;" /> </connectionStrings>
同时在项目新建一个Common文件夹,在里面添加两个公共的操做类,一个是对Dapper的简单封装DBHelper,另外一个是对配置文件的封装ConfigHelper。
首先是ConfigHelper:
using System.Configuration; namespace NancyMusicStore.Common { public class ConfigHelper { public static string GetAppSettingByKey(string key) { return ConfigurationManager.AppSettings[key].ToString(); } public static string GetConneectionStr() { return ConfigurationManager.ConnectionStrings["pgsqlConn"].ConnectionString.ToString(); } } }
包含两个方法,一个读取appsetting的方法,一个是读取链接字符串的方法。主要是用了System.Configuration来处理。
而后是DBHelper:
using Dapper; using Npgsql; using System.Collections.Generic; using System.Linq; using System.Data; namespace NancyMusicStore.Common { public class DBHelper { //open connection private static IDbConnection OpenConnection() { var conn = new NpgsqlConnection(ConfigHelper.GetConneectionStr()); conn.Open(); return conn; } //execute public static int Execute(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) { using (var conn = OpenConnection()) { return conn.Execute(sql, param, transaction, commandTimeout, commandType); } } //execute public static object ExecuteScalar(string cmd, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) { using (var conn = OpenConnection()) { return conn.ExecuteScalar(cmd, param, transaction, commandTimeout, commandType); } } //do query and return a list public static IList<T> Query<T>(string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null) where T : class { using (var conn = OpenConnection()) { return conn.Query<T>(sql, param, transaction, buffered, commandTimeout, commandType).ToList(); } } //do query and return the first entity public static T QueryFirstOrDefault<T>(string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null) where T : class { using (var conn = OpenConnection()) { return conn.QueryFirstOrDefault<T>(sql, param, transaction, commandTimeout, commandType); } } } }
这里只是对Dapper加了一层封装,实际上是无关紧要的,是为了Module里面的代码比较简洁才加的。
并且案例调用的所有是存储过程,在项目代码中看不到SQL语句,只能看到存储过程的名字。
至此,咱们的准备工做和项目已经搭建好了!
下一篇将开始打造咱们NancyMusicStore的首页了!
本文也已经同步到 Nancy之大杂烩