今天加一個小功能,只需要改appsettings.json
的連結字串,達到替換資料庫功能。
1.藉由判斷MSSQLConnString跟MSSQLConnString屬性的是否有值,決定使用哪種方式存取資料。
{
"blog": {
"SQLiteConnString":"DataSource=app.db",
"MSSQLConnString": "Data Source=(localdb)\\MSSQLLocalDB;Integrated Security=SSPI;Initial Catalog=ITHelpTestDB;"
}
}
2.因為資料庫都會去繼承、實作抽象類別DbProviderFactory
,所以只需要在SQLHelper類別新增該類別屬性,就可以達到修改屬性值簡單替換資料庫功能。
System.Data.SQLite.SQLiteFactory.Instance
類別System.Data.SqlClient.SqlClientFactory.Instance
類別public abstract class SqlHelper
{
/*連線字串跟DBPrividerFactory設定在Startup.cs*/
public static string connectionString;
public static System.Data.Common.DbProviderFactory dbProviderFactory ;
public static IDbConnection CreateDefaultConnection()
{
var conn = dbProviderFactory.CreateConnection();
conn.ConnectionString = connectionString;
conn.Open();
return conn;
}
}
並在Startup.cs類別ConfigureServices方法註冊存取方式,加上前面第一點判斷,跟第二點決定使用哪個工廠物件就可以:
//決定使用XML或是SQL讀取資料
services.Configure<BlogSettings>(Configuration.GetSection("blog"));
var section = Configuration.GetSection("blog").Get<BlogSettings>();
if (section.SQLiteConnString!=null && section.SQLiteConnString.Trim() != "")
{
SqlHelper.connectionString = section.SQLiteConnString;
SqlHelper.dbProviderFactory = System.Data.SQLite.SQLiteFactory.Instance;
services.AddSingleton<IBlogService, SQLiteBlogService>();/*SQLite*/
}
else if (section.MSSQLConnString!=null && section.MSSQLConnString.Trim() != "")
{
SqlHelper.connectionString = section.MSSQLConnString;
SqlHelper.dbProviderFactory = System.Data.SqlClient.SqlClientFactory.Instance;
services.AddSingleton<IBlogService, MSSqlBlogService>();/*SQL-Server*/
}
else
{
services.AddSingleton<IBlogService, FileBlogService>();/*XML*/
}