1

好的......我正在开发一个管理一些配置设置的dll(我不会在这里为您提供详细信息和推理,因为这不适用)。我有一个用于引用程序集的类,用于与该系统交互。这个类有一个 Load() 方法。当出现读取或验证错误时,我目前让它显示一个消息框。我不认为引用程序集应该负责管理这个?还是我错了?目前这对创建单元测试造成了严重破坏,所以我正在考虑添加一个属性来抑制消息,但仍然允许抛出异常。我阅读了另一篇 SO 帖子,建议有人使用 IoC 和对话结果助手类。插图是使用构造函数注入... 但这将再次将该责任交到参考大会手中。在这种情况下,最佳做法是什么?

4

2 回答 2

1

就个人而言,我认为你错了 - 对不起。DLL 的职责是通知错误,调用代码的职责是确定如何处理该通知。如果是图形用户界面,那么它可以显示一个对话框。如果是单元测试,它可以适当地测试。如果它是一个网站,它可以将通知以 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 回答