让服务向Controller传达错误的最佳方式

时间:2010-02-22 01:14:33

标签: asp.net-mvc architecture

当服务层只执行任务(检查是否存在Id,发送电子邮件等)时,让控制器知道是否有任何错误的最佳方法是什么?

我能想到的两个解决方案:

  1. 始终通过引用Service层中的方法传入额外的“破坏规则”参数,如果有任何错误,它将更新。

  2. 让服务引发异常并让控制器执行try / catch。

  3. 推荐这两种方法中的任何一种吗?如果没有,我可以采取什么方法让服务层让控制器知道出了什么问题(例如无效参数)?

3 个答案:

答案 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容器执行),并且只有其他单例协作者(在我的例子中,是域对象)。