使服务与控制器沟通错误的最佳方式
问题描述:
当服务层仅执行任务(检查Id是否存在,发送电子邮件等)时,让控制器知道是否存在的最佳方式是什么任何错误?使服务与控制器沟通错误的最佳方式
两个解决方案,我能想到的:
一个额外的“破规矩”参数总是通过引用传递到服务层的方法,其中如果有任何错误,将更新。
让服务引发异常并让控制器执行try/catch。
推荐这两种方法吗?如果没有,我可以采取什么方法让服务层让控制器知道哪里出了问题(如无效参数)?
答
你的服务应该收集所有破碎的规则,然后抛出“BrokenRuleException”。您的控制器将捕获“BrokenRuleException”,然后使用断点来更新用户界面。
答
我创建的接口:
public interface IModelStateWrapper
{
void AddModelError(string name, string error);
}
然后,我创建了每个控制器的实现:
public class ControllerModelStateWrapper : IModelStateWrapper
{
private ModelStateDictionary _dictionary;
public ControllerModelStateWrapper(ModelStateDictionary dictionary)
{
_dictionary = dictionary;
}
public void AddModelError(string name, string error)
{
if (_dictionary[name] == null)
_dictionary.Add(name, new ModelState());
_dictionary[name].Errors.Add(error);
}
}
每个服务实现:
public interface IModelWrapperService
{
IModelStateWrapper ModelWrapper {get;set;}
}
然后我将它设置在控制器:
public UserController(IUserService service)
{
_service.ModelWrapper = new ControllerModelStateWrapper(ModelState);
}
IModelStateWrapper不是最好的名称,因为此接口不仅可以与Controller.ModelState一起工作。作品很好。您可以轻松地用服务测试中的模拟或其他实现来替换IModelStateWrapper。该解决方案也会自动将ModelState设置为无效。
答
我认为抛出BrokenRuleException是一个不错的选择。我个人不喜欢把状态放在一个服务中,它通常是一个单例(由DI容器执行),并且只有其他单例协作者(在我的情况下是域对象)。