【发布时间】:2012-01-25 12:20:56
【问题描述】:
我正在为一个大学项目开发一个 MVC3 应用程序。我希望使用 WCF 作为 Web 服务,以便能够使用存储过程连接到远程数据库。我目前真的没有时间学习实体框架。
我的问题是存储过程名称应该放在哪里? MVC 模型应该将存储过程名称与值等一起传递给 WCF 服务,还是应该简单地调用 WCF 服务中的一个方法,该方法将保存存储过程名称并处理该方面?
谢谢。
【问题讨论】:
标签: c# wcf asp.net-mvc-3
我正在为一个大学项目开发一个 MVC3 应用程序。我希望使用 WCF 作为 Web 服务,以便能够使用存储过程连接到远程数据库。我目前真的没有时间学习实体框架。
我的问题是存储过程名称应该放在哪里? MVC 模型应该将存储过程名称与值等一起传递给 WCF 服务,还是应该简单地调用 WCF 服务中的一个方法,该方法将保存存储过程名称并处理该方面?
谢谢。
【问题讨论】:
标签: c# wcf asp.net-mvc-3
我的问题是存储过程名称应该放在哪里?
在位于 WCF 服务项目中的数据访问层中。 ASP.NET MVC 3 应用程序仅调用此服务上的方法。请记住,ASP.NET MVC 应用程序不知道什么是数据库,更不知道什么是存储过程。 ASP.NET MVC 应用程序仅适用于模型、控制器和视图。
因此,在您的 WCF 服务项目中,您将拥有一份服务合同:
[ServiceContract]
public interface IMyService
{
SomeModel Get(int id);
}
那么您可以在 WCF 服务中实现一个实现,该实现将去获取存储在任何位置的数据(在您的情况下,这将是一个 SQL 数据库,获取此数据的方法是调用存储过程):
public class MyService: IMyService
{
public SomeModel Get(int id)
{
// here you can call the stored procedure and return the corresopnding model
...
}
}
显然,这将使您的服务层与给定的数据访问技术紧密结合。为了将其解耦,您可以在服务和实际数据访问之间引入另一个抽象级别:
public class MyService: IMyService
{
private readonly IMyRepository _repository;
public MyService(IMyRepository repository)
{
_repository = repository;
}
public SomeModel Get(int id)
{
// you could do additional things in the service method
// like validating the arguments, call data access methods, ...
return _repository.Get(id);
}
}
并且实际的存储过程调用将在存储库的特定 SQL 实现中执行,该存储库将由您的 DI 框架注入到您的服务中。
在 ASP.NET MVC 应用程序中,您将只使用在添加服务引用时为您生成的强类型客户端代理中的 WCF 服务。
【讨论】:
存储过程名称应保存在位于 WCF 服务和实际数据库之间的数据访问层/库中。 IE。在您在 WCF 服务中调用哪些方法来获取数据的类中。
【讨论】: