当服务层只执行任务(检查是否存在Id,发送电子邮件等)时,让控制器知道是否有任何错误的最佳方法是什么?
我能想到的两个解决方案:
始终通过引用Service层中的方法传入额外的“破坏规则”参数,如果有任何错误,它将更新。
让服务引发异常并让控制器执行try / catch。
推荐这两种方法中的任何一种吗?如果没有,我可以采取什么方法让服务层让控制器知道出了什么问题(例如无效参数)?
答案 0 :(得分:2)
我创建了界面:
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;}
}
然后我在Controller中设置它:
public UserController(IUserService service)
{
_service.ModelWrapper = new ControllerModelStateWrapper(ModelState);
}
IModelStateWrapper不是最好的名称,因为此接口不仅可以与Controller.ModelState一起使用。工作得很好。您可以在服务测试中使用mock或其他实现轻松替换IModelStateWrapper。此解决方案还会自动将ModelState设置为无效。
答案 1 :(得分:2)
您的服务应收集所有损坏的规则,然后抛出“BrokenRuleException”。您的控制器将捕获“BrokenRuleException”,然后使用brokenrules更新用户界面。
答案 2 :(得分:0)
我认为抛出BrokenRuleException是个不错的选择。
就个人而言,我不喜欢将状态置于服务中,它通常是单例(由DI容器执行),并且只有其他单例协作者(在我的例子中,是域对象)。