2016-07-07 15 views
0

私はDictionaryをキーとして列挙型の値をとり、オブジェクトを値として返します。オブジェクトコンストラクタには、非常に時間がかかり、多くのメモリを消費するメソッドを呼び出す必要があります。今のところ、必要なものが1つだけであっても、辞書内の各オブジェクトが作成されます。キーで指定されたオブジェクトのみを作成する方法はありますか?方法はActiveDirectorySearcherに高価なメソッド呼び出しをそれぞれ有する5つのすべてDataPreparer Sを、作成することオブジェクトの辞書を作成すると、指定したキーのオブジェクトのみが作成されます

private DataPreparer SetUpOuDataPreparer() 
{ 
    Scope = _activeDirectoryScope.Context; 
    var activeDirectorySearcher = new ActiveDirectorySearcher(
     _activeDirectoryScope); 
    var ouDataPreparers = new Dictionary<QueryType, DataPreparer> 
    { 
     [OuComputers] = new DataPreparer 
     { 
      Data = activeDirectorySearcher.GetOuComputerPrincipals(), 
      Attributes = DefaultComputerAttributes 
     }, 
     [OuGroups] = new DataPreparer 
     { 
      Data = activeDirectorySearcher.GetOuGroupPrincipals(
       CancellationToken), 
      Attributes = DefaultGroupAttributes 
     }, 
     [OuUsers] = new DataPreparer 
     { 
      Data = activeDirectorySearcher.GetOuUserPrincipals(), 
      Attributes = DefaultUserAttributes 
     }, 
     [OuUsersDirectReports] = new DataPreparer 
     { 
      Data = activeDirectorySearcher.GetOuUsersDirectReports(
       CancellationToken), 
      Attributes = DefaultUserDirectReportsAttributes 
     }, 
     [OuUsersGroups] = new DataPreparer 
     { 
      Data = activeDirectorySearcher.GetOuUsersGroups(
       CancellationToken), 
      Attributes = DefaultUserGroupsAttributes 
     } 
    }; 
    return ouDataPreparers[QueryType]; 
} 

。私はどういうわけかをまたはif/elseを使わずにQueryTypeキーで指定して作成したいと考えています。私はより良い書式/スタイルのためにそれらをDictionaryに変更しました。

+0

なぜすべてで辞書を使うのか?なぜswitch文を使ったファクトリメソッドメソッドだけではないのですか? –

+0

@AntP私は、スイッチを避けたいと思っていた質問に言及しました。 –

+0

私は、彼らがどのような "文体的な理由"か分かりませんが、仕事のための適切なツールがきれいに見えないので、あなたが必要とするオブジェクトのコレクションを作成するのはちょっと後ろのようです。 –

答えて

1

あなたは価値の工場を取得し、ちょうど後でそれを起動しますのでFunc<DataPreparer>するタイプを変更することができますように

var ouDataPreparers = new Dictionary<QueryType, Func<DataPreparer>> 
{ 
    [OuComputers] =() => new DataPreparer 
    { 
     Data = activeDirectorySearcher.GetOuComputerPrincipals(), 
     Attributes = DefaultComputerAttributes 
    }, 

    return ouDataPreparers[QueryType](); 
} 

を、オブジェクトはあなたがそれを照会するたびに作成されます。

あなたが一度それを作成し、Lazy<DataPreparer>を使用することができシングルトンのように同じインスタンスを保持する場合:

var ouDataPreparers = new Dictionary<QueryType, Lazy<DataPreparer>> 
{ 
    [OuComputers] = new Lazy<DataPreparer>(() => new DataPreparer 
    { 
     Data = activeDirectorySearcher.GetOuComputerPrincipals(), 
     Attributes = DefaultComputerAttributes 
    }), 

    return ouDataPreparers[QueryType].Value; 
} 
+0

これらのオプションの両方が、警告「暗黙的にクロージャをキャプチャしました:これ」になります。思考? –

+0

おそらくlambdaで使われているオブジェクトの変数である 'DefaultComputerAttributes'のためだと思います。 –

+0

'Attributes'に割り当てられたすべての値は' static readonly Array'です。この警告は、 'OuUsers'と' OuComputers'のエントリ( 'CancellationToken'パラメータを取らない唯一の2つ)にも存在します。 –

6

DataPreparerクラスのDataプロパティにはLazy<T>を使用します。この方法では、実際に必要な場合には、作成時に一度にすべてを使用するのではなく、activeDirectorySearcher.GetOuGroupPrincipalsを呼び出します。