使用するデータストレージテクノロジが何であっても、アプリケーションが特定の実装に縛られないように、インターフェイスの背後にあるデータアクセスを抽象化することをお勧めします。これにより、将来的に決定した場合、他のストレージテクノロジに簡単に切り替えることができます。
public interface IDataStore
{
IQueryable<MyModel> Get();
void Add(MyModel model);
...
}
このように実装することができます:
public JsonDatastore : IDataStore
{
private readonly string dataFile;
private readonly IList<MyModel> data;
public Datastore(string dataFile)
{
this.dataFile = dataFile;
this.data = JsonConvert.DeserializeObject<IList<MyModel>>(File.ReadAllText(dataFile));
}
public IQueryable<MyModel> Get()
{
return this.data.AsQueryable();
}
public void Add(MyModel model)
{
// If you want a lock free implementation you may consider
// an algorithm which will only notify some underlying thread
// that a change has been made to the underlying structure and
// it will take care of saving those changes to the file system
// This way it is guaranteed that only one thread is writing
// to the file while the changes can be made in memory quite fast
// (using a ConcurrentBag<T> instead of a list for example)
lock (this)
{
// Make sure that only one thread is updating the file
this.data.Add(model);
string json = JsonConvert.SerializeObject(this.data);
File.WriteAllText(this.dataFile, json);
}
}
}
さて、最後の重要なビットがあることを確認することですあなたは、メモリ内のデータストア、そしてなぜを使用したいのであれば
依存性注入コンテナ内のDatastore
存続時間インスタンスをシングルトンと設定します。
速度を改善しましたか?あなたが本当にスピードを追っていれば、シリアライゼーションとリフレクション技術をバイパスし、フラットファイルを探します。しかし、正直言って、しないでください。残念ながらあなたの質問は広すぎます。 [尋ねる] – MickyD