Вы можете использовать отдельное веб-приложение для размещения веб-сервисов.Это даст вам возможность разместить ваше приложение MVC и службу WCF в отдельных виртуальных каталогах в IIS.После того, как вы написали веб-сервис, вы можете сгенерировать клиентский прокси, а затем в клиентском приложении вы можете использовать репозиторий:
public interface IProductsRepository
{
IEnumerable<Person> GetProducts();
}
, а затем иметь конкретную реализацию этого репозитория, которая будет извлекать данные из вашего WCF.service:
public class ProductsRepositoryWcf
{
public IEnumerable<Person> GetProducts()
{
using (var client = new YourWebServiceClient())
{
// call the web service method
return client.GetProducts();
}
}
}
И, наконец, вставьте этот репозиторий в конструктор вашего контроллера, который может выглядеть следующим образом:
public class HomeController: Controller
{
private readonly IProductsRepository _repository;
public HomeController(IProductsRepository repository)
{
_repository = repository;
}
public ActionResult Index()
{
var products = _repository.GetProducts();
// TODO: An intermediary step might be necessary to convert the Product
// model coming from the web service to a view model which is adapted
// to the given view
return View(products);
}
}
Как вы можете видеть, контроллер полностью отделен, кстати,данные получены.Все, что его волнует, это то, что он уважает данный контракт (интерфейс IProductsRepository).Используя ваш любимый DI-фреймворк, вы можете легко переключать реализацию.
Кстати, если ваш код похож на мой, единственное, что вы должны изменить в своем текущем приложении MVC, - это перенести модели и слои доступа к данным в отдельный сервисный проект WCF, к которому вы бы добавили ссылку на сервис, реализоватьрепозиторий ProductsRepositoryWcf
и проинструктируйте вашу инфраструктуру DI использовать эту реализацию вместо ProductsRepositorySql
, который теперь будет идти к веб-сервису.