2010-02-22 84 views
2

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

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

  1. 一个额外的“破规矩”参数总是通过引用传递到服务层的方法,其中如果有任何错误,将更新。

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

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

回答

2

你的服务应该收集所有破碎的规则,然后抛出“BrokenRuleException”。您的控制器将捕获“BrokenRuleException”,然后使用断点来更新用户界面。

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;} 
} 

然后我将它设置在控制器:

public UserController(IUserService service) 
{ 
    _service.ModelWrapper = new ControllerModelStateWrapper(ModelState); 
} 

IModelStateWrapper不是最好的名称,因为此接口不仅可以与Controller.ModelState一起工作。作品很好。您可以轻松地用服务测试中的模拟或其他实现来替换IModelStateWrapper。该解决方案也会自动将ModelState设置为无效。

0

我认为抛出BrokenRuleException是一个不错的选择。我个人不喜欢把状态放在一个服务中,它通常是一个单例(由DI容器执行),并且只有其他单例协作者(在我的情况下是域对象)。