【问题标题】:MVC with WCF service designMVC 与 WCF 服务设计
【发布时间】:2013-03-30 09:37:13
【问题描述】:

作为 MVC 和 WCF(有点)的新手,我想问一个设计问题。我有一个 MVC 应用程序,带有一个简单的屏幕。我需要调用一个 WCF 服务,它返回一个回复对象类型。为了将 WCF 调用与我的 MVC 应用程序分开,我创建了一个 ServiceProxy dll,它公开了一个名为 RegisterWithService 的方法,并向其传递了一个 IP 地址。

所以,MVC 应用程序调用

ServiceProxy.RegisterWithService(xxx.xxx.xxx.xxx);

然后该方法创建一个RegistrationRequest 对象,并将其发送到 WCF 服务。回复(RegisterResponce 对象)回复一个对象。

我的问题是,是否可以将该对象传递回 MVC 控制器进行处理,或者我应该创建某种形式的 DTO...以便 ServiceProxy 创建一个新的对象类型(也许,@987654327 @,它与 WCF 回复对象具有相同的字段,并将其传递回 MVC 应用程序?我猜,这使得 MVC 不依赖于 WCF 对象......所以服务合同的更改只会导致我创建的代理类的更改 - 将 MVC 应用程序隔离。

这看起来是个好设计吗?

【问题讨论】:

    标签: asp.net-mvc wcf


    【解决方案1】:

    我认为2级对象就足够了:

    1. 域模型(来自您的 WCF 服务)
    2. 查看模型(特定于 MVC 应用程序)

    因此,您可以使用在将 WCF 服务定义导入为存储库层时为您生成的服务代理接口。该接口将返回代表领域模型的数据合约。 Controller 将负责调用此接口上的各种方法,并将域模型映射到将传递给视图的视图模型。

    例如:

    public class HomeController: Controller
    {
        private readonly IServiceProxy service;
        public HomeController(IServiceProxy service)
        {
            this.service = service;
        }
    
        public ActionResult Index(int id)
        {
            SomeDataContract domainModel = this.service.Get(id);
            MyViewModel model = Mapper.Map<SomeDataContract, MyViewModel>(domainModel);
            return View(model);
        }
    }
    

    当然,如果您的应用程序变得更复杂,您可以引入额外的抽象层和 DTO。

    【讨论】:

    • 这意味着 WCF 服务对象暴露给 MVC 应用程序。这是正确的吗?
    • 是的,它们将被暴露。否则你怎么会想到使用这个 WCF 服务?
    • 这是一个有效的问题,但我的计划是使用一个服务代理类,它公开基本方法,并完成所有与服务相关的工作......然后返回......一些东西......我的 MVC 应用程序。您建议我返回 WCF 服务对象,这意味着,我需要在我的 MVC 应用程序中引用 WCF 服务,我希望避免这种情况 - 尽管似乎端点需要在 MVC 应用程序中,并传递给代理类......所以......我被卡住了。 :)
    • 不,您不需要任何参考。例如,您可以使用 svcutil.exe 从元数据生成客户端代理。或者只是 Visual Studio 中的导入服务引用。这将生成允许您使用服务的客户端代理类。它将包含数据和服务合同。无需参考任何东西。当然,如果服务发生变化,您的客户端将会中断,您对此无能为力。无论您多么努力,您的客户都将始终依赖该服务。
    猜你喜欢
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多