2009-06-08 11 views
11

LINQ to SQLとMVPを使用して.NET 3.5 Windows Formsアプリケーションを開発しています。私たちは、データを取得するためのDataRepositoryクラスがあります。DBUserRepositoryのすべてのインスタンス間でのユーザーのリストをキャッシュするために静的変数を使用してデータをキャッシュする

public class DbUserRepository : IUserRepository 
{ 
    private IList<UserName> _users; 

    public IList<UserName> GetUserNames() 
    { 
    if (_users == null) 
    { 
     // retrieve _users from DB 
    } 

    return _users; 
    } 

を、私たちは、エンタープライズライブラリのキャッシュアプ​​リケーションブロックを使用するつもりでした。

しかし私には、自分自身を静的メンバーにすることはできませんでしたか?何らかの理由で「古い学校」のように見えるが、それは機能する。これを行うことには欠点がありますか?これは悪いデザインと見なされますか?

private static IList<UserName> _users; 

おかげで、単純なキャッシュ用

答えて

10

これを行うことの最大の欠点は、正確にはstaticの意味によるものです。多くのDbUserRepositoryオブジェクトを持つことはできますが、常に1つの_users変数だけを共有します。これが問題の原因となるケース:あなたのアプリは、これまでマルチスレッドとなり、そしてあなたは、各スレッドが独自の個別のユーザーリポジトリを持つようにしたい場合は

  • を(これは懸念がリポジトリがに何を意味するのかに依存しているか否か

  • ユニットテストでは、このクラスで複数のユニットテストを実行すると、テストとテストの間で状態が保持されるため、テスト実行がオーダーに依存するようになります。 ...かなり望ましくない。

3

私は、静的変数は大丈夫だと思うだけで_users変数にアクセスする複数のスレッドを保護するためにロックを使用してについて少し注意する必要があります。ただし、ASP.NET Cacheクラスを使用する方がよいでしょう。私はそれがSystem.Web名前空間にあることを知っていますが、あなたはuse it outside of ASP.NET application tooです。

3

いくつかのことを考慮する必要があります。変数

  • のAppDomainを初期化する

    1. スレッドセーフ。静的変数は、AppDomainインスタンスに対してローカルです。したがって、複数のAppDomainsを実行している場合、キャッシュの複数のインスタンスがあります

    これらは、アプリケーションに関係する場合があります。おそらくそうではないが、注目に値する。

  • 0

    複数のものが必要な場合は、コードから静的なものを切り取り、すべての場所で渡すように余計に努力する必要があります。

    関連する問題