iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 26
3
Modern Web

輕量高效.NET Core開源Blog引擎:Miniblog.Core系列 第 26

26.改連結字串,替換不同資料庫功能

今天加一個小功能,只需要改appsettings.json的連結字串,達到替換資料庫功能。

邏輯:

1.藉由判斷MSSQLConnString跟MSSQLConnString屬性的是否有值,決定使用哪種方式存取資料。

{
  "blog": {
    "SQLiteConnString":"DataSource=app.db",
    "MSSQLConnString": "Data Source=(localdb)\\MSSQLLocalDB;Integrated Security=SSPI;Initial Catalog=ITHelpTestDB;"
  }
}

2.因為資料庫都會去繼承、實作抽象類別DbProviderFactory,所以只需要在SQLHelper類別新增該類別屬性,就可以達到修改屬性值簡單替換資料庫功能。

  • sqlite使用System.Data.SQLite.SQLiteFactory.Instance類別
  • sqlserver使用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*/
}

上一篇
25.NET Core密碼PBKDF2加密方式處理
下一篇
27.使用UTC時間需要注意Kind問題
系列文
輕量高效.NET Core開源Blog引擎:Miniblog.Core30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言