1

わかりました... 私は、いくつかの構成済み設定を管理する dll に取り組んでいます (ここでの詳細と推論は当てはまりません)。このシステムとのインターフェイスに使用するアセンブリを参照するためのクラスがあります。このクラスには Load() メソッドがあります。読み取りエラーまたは検証エラーがある場合、現在、メッセージ ボックスを表示しています。これを管理するのは参照アセンブリの責任であるべきだとは思いませんでしたか? それとも私が間違っていますか?現在、これは単体テストの作成に大混乱を引き起こしているため、メッセージを抑制するプロパティを追加することを検討していますが、それでも例外がスローされることを許可しています。誰かが IoC とダイアログ結果ヘルパー クラスの使用を推奨されている別の SO 投稿を読みました。イラストはコンストラクターインジェクションでした... しかし、それは再びその責任を参照アセンブリの手に委ねることになります。この場合のベストプラクティスは何ですか?

4

2 に答える 2

1

個人的には、あなたは間違っていると思います - ごめんなさい。DLL の責任はエラーを通知することであり、呼び出し元のコードの責任はその通知をどう処理するかを決定することです。GUI の場合は、ダイアログ ボックスを表示できます。単体テストであれば、適切にテストできます。Web サイトの場合は、通知を HTML でユーザーに書き出すことができます。何らかのサービスであれば、ログに記録できます。等々。

于 2013-01-17T15:29:28.883 に答える
0

デリゲートを使用して、別の場所で処理されるメッセージを送信できます。単体テストを使用して以下の例を作成しました。

    public delegate void ErrorHandlingDelegate(Exception exception);  //The delegate 


    public class AsseblymRefClass //Your class doing the business logic 
    {
        public void DoStuff(ErrorHandlingDelegate errorHandling) //Passing the delegate as argument
        {
            try
            {
                //Do your stuff
                throw new Exception();
            }
            catch (Exception ex)
            {
                errorHandling(ex); //Calling the delegate
            }
        }
    }


    //Another class that can handle the error through its method 'HandleErrorsFromOtherClass()'
    public class ErrorHandlingClass
    {
        public void HandleErrorsFromOtherClass(Exception exception)
        {
            MessageBox.Show(exception.Message);
        }

    }



    [Test]
    public void testmethod() //The test that creates your class, and a class for the errorhandling, and connects the two
    {
        ErrorHandlingClass errorHandling = new ErrorHandlingClass();

        AsseblymRefClass assemblyRef = new AsseblymRefClass();

        assemblyRef.DoStuff(errorHandling.HandleErrorsFromOtherClass);
    }

デリゲートに適合する任意のメソッドを使用できます。したがって、製品コードを単体テスト時にメッセージボックスを表示しないものに置き換えることができます。

于 2013-01-17T15:41:12.763 に答える