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