1

私は次のクラスを書いています

public class UserApplication
{
    private IUserRepository UserRepository { get; set; }

    private IUserEmailerService UserEmailerService { get; set; }

    public UserApplication(IUserRepository userRepository, IUserEmailerService userEmailerService)
    {
        this.UserRepository = userRepository;
        this.UserEmailerService = userEmailerService;
    }

    public bool Authenticate(string login, string pass)
    {
        // Here I use UserRepository Dependency
    }

    public bool ResetPassword(string login, string email)
    { 
        // Here I only use both Dependecies
    }

    public string GetRemeberText(string login, string email)
    {
        // Here I only use UserRepository Dependency
    }
}

Unityを使用してインスタンスを管理しているので、1つのメソッドで両方の依存関係のみを使用していることに気付きました。そのため、コンテナーにこのクラスのインスタンスを提供するように依頼すると、両方の依存関係がこのクラスに挿入されますが、2つは必要ありません。すべてのメソッドのインスタンスなので、Authenticateuserではリポジトリのみが必要です。だから私はこれをするのは間違っていますか?このクラスのすべてのケースに使用する依存関係のみを持つ別の方法はありますか?

私はそれにコマンドパターンを使用することを考えているので、1つのメソッドで3つのクラスを分類し、その中に必要な依存関係のみを次のように分類します。

public class AuthenticateUserCommand : ICommand
{
    private IUserRepository UserRepository { get; set; }

    public string Login { get; set; }

    public string Password { get; set; }

    public void Execute()
    {
        // executes the steps to do that
    }
}



public class ResetUserPasswordCommand : ICommand
{
    private IUserRepository UserRepository { get; set; }

    private IUserEmailerService UserEmailerService { get; set; }

    public string Login { get; set; }

    public string Email { get; set; }

    public void Execute()
    {
        // executes the steps to do that
    }
}
4

3 に答える 3

0

だから私はこれを間違っていますか?

No. 2 の依存関係は世界の終わりではありません。コンストラクターが肥大化したり、読み取れなくなったりすることはありません。

ただし、以前に与えられた回答は、3〜4以上の依存関係がある場合に適しています。

特定の依存関係がメソッドでのみ使用されている場合は、特定の依存関係をパラメーターとしてメソッドに渡すこともできます。この意味で、Unity のメソッド呼び出しインジェクションを試してみたいと思うかもしれませんが、それが正確にその目的のために意図されているかどうかはわかりません。

于 2013-03-13T17:00:39.713 に答える
0

もう 1 つの方法は、動作ごとに役割固有のインターフェイスを作成することです。したがってIUserAuthenticationServiceIUserPasswordResetService、 、およびIUserRememberPasswordService. インターフェイスは、SRP を維持するために、単一のクラスでUserApplication実装することも、個々のクラスで実装することもできます。あなたが説明するコマンドパターンには、SRP にも同様の利点があります。コマンド パターンの 1 つの問題は、これらの依存関係を何かによって提供する必要があることです。依存関係がコントローラーによって提供される場合でも、最初に依存関係をコントローラーに取得する必要があり、最初の例と同様の問題が残ります。

役割固有のインターフェイスのケースとコマンド パターンのトレードオフは、まとまりの喪失です。このコストは、SRP を適用する程度と同様に、好みと視点の問題であることは間違いありません。一方では、単一のクラスが認証関連の動作を処理することによって提供される結束は、有益な場合があります。一方、説明したように、依存関係の不整合につながる可能性があります。

于 2013-03-13T02:38:01.877 に答える