4

1 つの設計提案が必要です。以下のクラスをご覧ください。クラスにはメソッドが 1 つだけあります クラスには、パラメーターとして userName と passWord を取るコンストラクターがあります。質問は - 違いは何ですか -- コンストラクターからユーザー名と pwd を削除した場合 -- そして (userName, password) を AuthoriseUser メソッドに送信します

これらすべては、依存関係の注入のバックグラウンドにあります

 public class UserNameAuthorisationService : IUserNameAuthorisationService
{
    private readonly string _userName;
    private readonly string _password;
    private readonly IUserNameAuthorisationRepository _usernameAuthRepository;

    public UserNameAuthorisationService(string UserName, string Password, IUserNameAuthorisationRepository UsernameAuthRepository)
    {
        _userName = UserName;
        _password = Password;
        _usernameAuthRepository = UsernameAuthRepository;
    }

    public IUser AuthoriseUser()
    {
        throw new NotImplementedException();
    }
}

前もって感謝します。

4

3 に答える 3

2

引数コンストラクターを定義する主なアイデアは、開始パラメーターでクラスを開始することです。今後ユーザー/パスワードを変更したくない場合は、引数コンストラクターを使用することをお勧めします。

一方、ユーザー/パスワードを変更する場合は、setメソッドと引数なしのコンストラクターを使用してください。

ところで、 2段階構築と呼ばれる完全に初期化されていないクラスを作成することはアンチパターンです

于 2012-12-05T19:19:21.190 に答える
2

一般的に、私は次のパターンに従うようにしています。機会があれば、外部依存関係にコンストラクター インジェクションを使用します。

  1. 可能な場合はコンストラクター インジェクションを使用します
  2. コンストラクター インジェクションを組み込む可能性がなく、適切なデフォルト値がある場合に備えて、プロパティ インジェクションを使用します。
  3. メソッド インジェクションは、メソッド呼び出しごとに依存関係が異なる特定のシナリオで一定の利点があります (詳細については、こちらを参照してください: http://manning.com/seemann/DIi.NET_sample_ch04.pdf ) 。

あなたの場合、私は次のことを行います:

  1. リポジトリの注入をコンストラクターに残す
  2. ユーザー名とパスワードをメソッド コンテキストに移動します。これは、DI コンテナーによって提供される可能性は高くありませんが、コンテキスト固有であるためです。これらのパラメーターは依存関係ではなく、値オブジェクトなどと見なします。

コンストラクター インジェクションを配置することは、一般的に DI で可能な最善のアプローチです。最大の利点の 1 つは、クラスが SOLID の原則に違反しているかどうかを簡単に確認でき、1 つの場所に依存関係がいくつあるかを確認できることです。

于 2012-12-05T19:55:04.770 に答える
1

コンストラクターで初期パラメーターを渡すことは、非可変オブジェクトに適しています。setter メソッドを提供しない場合、それらを変更することは「不可能」です (リフレクション トリックを考慮しない場合)。

この値を API 経由で変更できないようにする場合は、これがこの要件を満たす唯一の方法です。それ以外の場合は、セッターを実装できます。セッターを実装しても、このオブジェクトはユーザー名とパスワードなしでは存在できない (存在する意味がない) と考えるかもしれません。この場合、セッターとコンストラクターの開始の両方を保持します。

このオブジェクトは、パスワード/ユーザー名/リポジトリがなければ存在する意味がないので、コンストラクターでの初期化を維持します。

コンポーネントとして機能することになっている場合は、ユーザー名とパスワードのパラメーターをAuthoriseUserメソッドに移動UserNameAuthorisationServiceし、たとえば、1 つの一意のアプリケーション インスタンスを持ちます (DI コンテナーがこれを管理する必要があります)。このシナリオでは、DI を介してこのオブジェクトをクライアント オブジェクトに挿入します。

重要な点は、init() メソッドや populate() メソッドを使用せずに、オブジェクトを常に一貫した状態に保つことです。@Maximが指摘したように、オブジェクトを常に完全に初期化し、常に使用可能な状態に保ちますAuthoriseUser().

于 2012-12-05T19:39:02.867 に答える