開發環境
OS : Windows 10 10.0.14393
IDE : Visual Studio 2015 Community With Update 3
Database : PostgreSQL 9.6
DBMS :pgAdmin 4
遷移數據與配置PG遠程訪問
MVC MusicStore中的數據分為兩部分:系統相關數據和MemberShip產生的用戶數據
這里我們只需要系統相關的數據,Membership相關的數據就讓它見鬼去吧~~
系統相關的數據是存儲在SQL Server Compact,通過Database4打開這個數據庫,然后將這個數據庫生成相關的腳本,對這些腳本簡單的修改一下,拿到pg Admin 上執行。
然后還添加了一張新的用戶表,建表語句如下
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部署的時候會提示無法訪問數據庫。
只需要修改 pg_hba.conf 這個配置文件
直接將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之大雜燴