TokugawaTakeshi / CrossPlatformOrganizerAppplication

0 stars 0 forks source link

DbContextの再利用 #6

Open TokugawaTakeshi opened 2 years ago

TokugawaTakeshi commented 2 years ago

PersonLocalEF_SQLiteGatewayの中に下記の様にLocalDataBaseContextを使ってみました。

public class PersonLocalEF_SQLiteGateway : IPersonGateway
{

  private readonly LocalDataBaseContext _dataBaseContext = new LocalDataBaseContext(); 
  // ...
}

複数のゲートウェイだったら、何回もLocalDataBaseContextを作る事になりますね。 もしこれを避けた方が良いとしたら、LocalDataBaseContextの注射方法を考えます。

西野さんの説明を待っています。

gummoni commented 2 years ago

複数個所で利用する場合は、シングルトンパターンを利用すると良いです。

public class LocalDataBaseContext : DbContext
{

  public static DbSet<PersonModel> PeopleModels { get; internal set;  }

  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  {
    base.OnConfiguring(optionsBuilder);
    string stringifiedConnectionData = new SqliteConnectionStringBuilder { DataSource = "c:\\tool\\db.sqlite3"}.ToString();
    optionsBuilder.UseSqlite(new SqliteConnection(stringifiedConnectionData));
  }

  public static DbSet<PersonModel> GetInstance() => PeopleModels;
}

void usage() {
  var_dataBaseContext = LocalDataBaseContext.GetInstance();
}
TokugawaTakeshi commented 2 years ago

@gummoni

ありがとう。将来に別の実態もどんどん追加されますから、下記の様に実装しました。

public class LocalDataBaseContext : DbContext
{

  private static LocalDataBaseContext _selfSoleInstance; 

  public DbSet<PersonModel> PeopleModels { get; internal set;  }

  public static LocalDataBaseContext GetInstance()
  {
    return _selfSoleInstance ?? (_selfSoleInstance = new LocalDataBaseContext());
  }

  protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  {
    base.OnConfiguring(optionsBuilder);
    string stringifiedConnectionData = new SqliteConnectionStringBuilder { DataSource = "c:\\tool\\db.sqlite3" }.ToString();
    optionsBuilder.UseSqlite(new SqliteConnection(stringifiedConnectionData));
  }

}

先ずは他の問題も処理してから動かしてみましょう。