Webサービスのホスティングに別のWebアプリケーションを使用できます。これにより、IISの別々の仮想ディレクトリにMVCアプリケーションとWCFサービスをホストすることができます。あなたは、Webサービスを書いたら、クライアントプロキシを生成することができ、その後、クライアント・アプリケーションでは、リポジトリを使用できます。
public interface IProductsRepository
{
IEnumerable<Person> GetProducts();
}
をして、あなたのWCFサービスからデータを取得します。このリポジトリの特定の実装を持っています:
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
の代わりにこの実装を使用するように指示します。ProductsRepositorySql
はWebサービスに移動します。
WCFサービスを作成する必要がある特別な理由はありますか?ビュー出力として 'JsonResult'を返すことによってWebサービスとしてMVCだけを使用することはできませんか? – KallDrexx
@KallDrexx:柔軟性の欠如が理由です。 –
@ KallDrexx、コントローラー内からSQLサーバーに直接アクセスできるときに 'JsonResult'を使うのはなぜですか?ここでの質問は、さまざまなクライアントによって消費される可能性のある再利用可能なサービスを公開することだと思います。 –