5

データベース内のテーブルに基づいてモデルを定義しました。現在、データがほとんど変化しないモデルがいくつかあります。たとえば、e-comm サイトが販売する製品のカテゴリ、製品を出荷する都市などです。これらは頻繁には変更されないため、データベースへのアクセスを避けるために、現在は静的変数として保存されています。

問題は、これらの静的変数をコード内のどこに配置するかです。現在、ProductCategory クラス (モデル表現でもあります) では、空の場合はデータベースを呼び出して製品カテゴリをロードする静的リストが定義されています。同様に、City クラスにも同様の静的 List などがあります。

これらの静的リストは、アプリケーション全体で使用されます。StaticData というクラスを作成し、このクラス内にすべての静的リストを保持することを考えていました。それは今の代わりに

ProductCategory.AllCategories.Find(p => p.Id = 2) 

私は持っているでしょう

StaticData.AllProductCategories.Find(p => p.Id = 2) 

どちらがより良いアプローチだと思いますか? また、テスト容易性とコードの分離も目指しています。

また、これらを達成するためのより良い方法はありますか? コードで同様のことを行うにはどうすればよいですか?

4

3 に答える 3

3

コードにコンパイルするのに十分静的であり、実行時に変更する必要がない場合は、静的クラスを使用できます。たとえば、列挙型をクラスに変換する一般的なパターンを参照しください

そのようなものはおそらくあなたのシナリオでうまくいくはずです:

public class Vehicle
{
    public static Vehicle Car = new Vehicle("Car");
    public static Vehicle MotorBike = new Vehicle("MotorBike");
    public static Vehicle PeopleMover = new Vehicle("PeopleMover");

    private Vehicle(string name)
    {
        this.name = name
    }
    private string name;
}

列挙型またはそのような静的メンバーを持つクラスを使用すると、コード内の厄介なマジックナンバーも取り除くことができますが、構文が正しくない(欠落している=)ため、これは単なるサンプルであると思いますコードであり、実際のコードベースでは何のようにも見えません。

変更が時々発生し、データベース内のカテゴリのリストが必要な場合は、それらを密にキャッシュすることができます(ほとんどの場合、期限切れになることはありませんが、更新時に手動で無効になります)。カテゴリのリストのサイズに応じて、コレクション全体を1つの大きなキャッシュに入れ、キャッシュされたオブジェクトに個別のカテゴリを照会することを検討します。カテゴリごとに1つの個別のキャッシュエントリを保持するのではありません。

于 2012-06-28T08:03:00.440 に答える
3

簡単な答えはありません。いくつかのオプションがあり、どれがアプリに適しているかを検討する必要があります。

  • ある種のキャッシュを使用する場合があります。

    製品カテゴリが頻繁に変更されない場合は、複雑すぎる可能性があります。これは、パフォーマンスの問題(頻繁に読み取られる数千のカテゴリ)があり、製品カテゴリが頻繁に変更される場合に理想的です。どのオープンソースキャッシュシステムからも恩恵を受けることができますが、このソリューションはより複雑になる可能性があります。

  • それらを列挙型としてハードコーディングする場合があります。

    製品カテゴリが決して変更されないことを100%確信している場合にのみ有効です...これまでに!

  • LazySingletonまたはStaticクラスがある可能性があります。(私の好み)

    IMHOのベストプラクティスは、レイジーシングルトンまたは静的ProductCategoryクラスを持つことです。あまり頻繁に変更されないデータがほとんどない場合、たとえばリリースで変更される可能性がある場合に理想的です。2つのアプローチがあります:

    Load in Init:静的変数は定数としてビジネスロジックレイヤーに保持する必要があります。この場合、アプリケーションの開始時に製品カテゴリをプリロードして、常に保持できます。このアプローチでは、アプリケーションのロードに時間を費やします。

    初回使用時にロード:カテゴリに初めてアクセスするときに、カテゴリがロードされているかどうかを確認します。いいえの場合、クラスはそれらをロードします。このアプローチでは、製品カテゴリにアクセスする必要がある最初の瞬間に時間を費やします。

    これら2つのアプローチのいずれでも、アプリケーションプールを再起動するたびにデータが失われるため、新しいバージョンをリリースすると、データが更新されます。DBの「緊急」更新の場合は、いつでも後でアプリケーションプールを再起動できます。

于 2012-06-28T08:07:14.187 に答える
3

静的変数の代わりにCacheを使用する必要があると思います。

あなたのコードについての詳細はわかりません。リポジトリを使用している場合は、次のようなことができます。

if [cache contains object or collection I need]
{
   return [object or collection from cache]
}
else
{
   [get object or collection from database]
   [save object or collection in cache]
   return [object or collection from database]
}

次に、キャッシュされたエンティティを変更する場合は、キャッシュされたエントリを削除して DB から新しいデータを取得する方法を見つける必要があります。

于 2012-06-28T08:00:03.063 に答える