0

この単純なクラスを定義したとしましょう。

public class State
{
    public int Id { get; set; }
    public string Name { get; set; }
}

次に、50個の名前付きインスタンスを定義、作成、登録します。ユーザーがログオンすると、(たとえば、彼の構成設定から)どの状態から来たのかがわかります。私のコントローラーでは、言うのは簡単でしょう

var userState= ObjectFactory.GetNamedInstance<State>("Idaho");

ただし、次のように、コンストラクターで渡す方がはるかに望ましいです。

public class HomeController : ControllerBase
{
    private State _state;

    public HomeController(State state)
    {
        _state = state;
    }
}

ただし、これが機能するには、特定のインスタンスを渡す必要があります。これを指定する方法はありますか?

私がちょうど考えたもう一つのこと。50の個別の状態を定義する代わりに、次のように状態のコレクションとして定義できます。

public class StateCollection
{
    public List<State> States { get; set; }
}

次に、コンストラクターでStateCollectionを渡します。その後、クライアントはLINQを使用して、適切な状態を選択できます。それは合理的なアプローチですか?コレクションが大きい場合はどうなりますか?

4

1 に答える 1

2

あなたがしたいことは、コンテキストベースのインジェクションと呼ばれます。そうすることは可能かもしれませんが、コンテキストベースのインジェクションは通常、アプリケーションの設計にエラーがあることを示しています。あなたの場合、ICurrentUserServiceシステム内の現在のユーザーに関する情報を提供する単純な抽象化が欠落しているようです。

public interface ICurrentUserService
{
    State State { get; }
}

その後、クライアントはLINQを使用して、適切な状態を選択できます。それは合理的なアプローチですか?

いいえ、おそらくそうではありません。これは、クライアントがユーザーにとって適切な状態を見つける責任を負うためですが、これはすでに知っています。繰り返しますが、正しい抽象化を使用してください。これにより、クライアントコードがはるかに簡単になります。

コレクションが大きい場合はどうなりますか?

これは私には時期尚早の最適化のように聞こえます。それが十分に速いなら、それは十分に速いです。しかし、コレクションが時間の経過とともに大きくなり、遅くなるとどうなりますか?これをLINQステートメントとしてコンシューマーに実装すると、すべてのコンシューマーを変更する必要があるため、修正するのが難しい場合があります。このLINQステートメントをICurrentUserService抽象化の実装(またはそれを呼び出したいもの)内に記述した場合、それは1回の簡単な書き直しの問題です。LINQクエリをaの使用に変更するだけで、Dictionary<string, State>完了です。

于 2012-11-10T15:38:00.760 に答える