【问题标题】:MVC Repository Pattern/Web Services SoC QuestionMVC 存储库模式/Web 服务 SoC 问题
【发布时间】:2010-08-26 19:26:23
【问题描述】:

我是 ASP.NET MVC 的新手,我正在尝试为使用 Web 服务作为其数据源的中小型应用程序实施最佳实践。 Web 服务公开了以下方法来支持应用程序:

  1. AuthenticateCustomer - 如果电子邮件/密码有效,则返回客户 ID
  2. GetCustomer - 返回包含客户信息的序列化对象

我的问题是,所有这些服务都根据操作结果返回 Success (bool) 和 Message (string) 值。如果发生错误,该消息包含描述性信息。我不确定 Web 服务的调用是否属于 Repository 层,但我认为能够通过 Repository -> Service -> Controller 层向上传递 Success 和 Message 值很重要。我能想到的唯一方法是在没有参数的情况下乱扔存储库方法:

public int AuthenticateCustomer(string Email, string Password, out bool Success, out bool Message);

或创建某种包装器,其中包含预期的返回值(整数)以及 Success 和 Message 值。但是,每个 Web 服务方法都返回不同的值,因此一刀切的包装器将不起作用。此外,这些值需要通过服务层向上传递,并且似乎某种类型的验证正在存储库级别进行。

关于如何完成的任何想法: 1. 关注点分离(验证、通过 Web 服务访问数据)同时... 2. 是否有能力维护从 Web 服务收到的反馈并将其一直传递到 View?

附: - 很抱歉这个简洁的问题。用任何一种简洁的方式来解释都有点困难。

【问题讨论】:

    标签: asp.net-mvc-2 repository-pattern


    【解决方案1】:

    您需要存储库吗?根据您的描述,我将 Web 服务视为存储库。然后,我将使用服务(业务层)调用 Web 服务,并让其中的逻辑处理错误或成功。

    让业务层将客户对象从 Web 服务转换为业务对象,并将其传递给控制器​​。

    存储库(Web 服务)-> 服务(业务层)-> 表示层(控制器)

    【讨论】:

    • 马丁,你的回答很有道理。正如我所想的那样,我的应用程序不“拥有”数据,也不负责将数据维护到持久存储(Web 服务处理这个),因此不需要显式存储库。感谢您的意见。
    【解决方案2】:

    马丁的回答很好。

    我可能会看到在 Web 服务周围薄层以方便测试的案例。

    如果您确实走这条路并且 Success = false 不是常见情况,您可以抛出您自己类型的异常,其中包含 Success 和 Message。如果它真的是一个特殊的条件,我只会这样做。如果您发现您的业务层捕获异常只是为了向表示层返回错误代码,那么这是错误的方法。

    【讨论】:

    • Rob,这是我在设计时遇到的问题。我能够在服务层上执行一些验证,但是 Web 服务中内置了一些我无法在我的业务层中处理的业务规则。例如,有一项服务允许客户更改他的登录名(电子邮件)。 Web 服务验证新登录名尚未被其他客户使用。重要的是要让服务层捕获此反馈,然后将其呈现给用户。它“感觉”非常错误,但我正在努力寻找更好的方法来处理它。
    猜你喜欢
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2014-09-19
    • 2015-01-22
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多