好的......我正在处理一个管理一些已配置设置的dll(我不会在这里讨论细节和推理,因为这不适用)。我有一个用于引用程序集的类,用于与此系统进行交互。这个类有一个Load()方法。当出现读取或验证错误时,我目前正在显示一个消息框。我觉得应该由引用程序集负责管理它?还是我错了?目前这正在创建单元测试的破坏,所以我正在考虑添加一个属性来抑制消息,但仍然允许抛出异常。我在另一篇文章中读到了有人建议使用IoC和对话结果助手类的帖子。插图是使用Constructor Injection ...但是这将再次将该责任交给引用程序集。在这种情况下,最佳做法是什么?
答案 0 :(得分:1)
就个人而言,我认为你错了 - 抱歉。 DLL的职责是通知错误,调用代码的责任是确定如何处理该通知。如果是GUI,则可以显示对话框。如果是单元测试,则可以进行适当的测试。如果它是一个网站,它可以用HTML将通知写出来给用户。如果它是某种服务,它可以记录它。等等。
答案 1 :(得分: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);
}
可以使用任何适合委托的方法。因此,您可以使用在单元测试时未显示消息框的内容替换您的生产代码。