2010-11-30 16 views
1

J'utilise ASP .NET MVC2 pour créer un site Web piloté par les données. Une partie de la demande de fonctionnalité consiste également à créer des services Web réutilisables pour exposer certaines données et la logique métier à l'aide desquelles les utilisateurs finaux peuvent créer des mashups. Il y aura un nombre important d'utilisateurs qui l'utilisent à l'intérieur et à l'extérieur de notre organisation. Jusqu'à présent, j'ai construit l'application qui communique avec la base de données (en utilisant l'ORM framework d'entité), traite et affiche les données (en utilisant le modèle de modèle de vue de vue modèle). Cette partie a été simple pour la partie site web.Webservices dans ASP .NET MVC2

En ce qui concerne la partie services Web, je suis en train d'étudier l'utilisation de WCF pour créer les services Web. Dois-je créer des services de données WCF en tant que projet distinct. Je devine que je devrais être capable de réutiliser une partie du code dans le contrôleur.

Dans la partie site Web, devrais-je appeler ces services Web et les utiliser comme modèle? Des meilleures pratiques?

En tant que somoeone nouveau à asp. Net, tous les pointeurs vers la bonne direction seraient grandement appréciés.

+0

Y a-t-il une raison particulière pour laquelle vous devez créer un service WCF, et vous ne pouvez pas simplement utiliser MVC en tant que votre service Web en retournant 'JsonResult' en sortie de la vue? – KallDrexx

+0

@KallDrexx: le manque de flexibilité serait une raison. –

+0

@KallDrexx, pourquoi utiliser 'JsonResult' lorsque vous pouvez accéder directement au serveur SQL à partir du contrôleur? Je pense que la question ici est d'exposer un service réutilisable qui pourrait être consommé par différents clients. –

Répondre

2

Vous pouvez utiliser une application Web distincte pour héberger les services Web. Cela vous donnera la possibilité d'héberger votre application MVC et le service WCF dans des répertoires virtuels distincts dans IIS. Une fois que vous avez écrit le service Web que vous pouvez générer un proxy client puis dans l'application cliente, vous pouvez utiliser un référentiel:

public interface IProductsRepository 
{ 
    IEnumerable<Person> GetProducts(); 
} 

et une mise en œuvre spécifique de ce référentiel qui récupérera les données de votre service WCF:

public class ProductsRepositoryWcf 
{ 
    public IEnumerable<Person> GetProducts() 
    { 
     using (var client = new YourWebServiceClient()) 
     { 
      // call the web service method 
      return client.GetProducts(); 
     } 
    } 
} 

Et enfin injecter ce référentiel dans le constructeur de votre contrôleur qui pourrait ressembler à ceci:

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); 
    } 
} 

comme vous pouvez le voir maintenant le contrôleur est complètement découplé par la façon dont les données sont récupérées. Tout ce qu'il faut, c'est qu'il respecte le contrat donné (interface IProductsRepository). En utilisant votre framework DI préféré, vous pouvez facilement changer d'implémentation. Par ailleurs, si votre code ressemble à la mienne, la seule chose que vous devez changer dans votre application MVC actuelle est d'externaliser les modèles et les couches d'accès aux données dans un projet de service WCF distinct auquel vous ajouteriez ProductsRepositoryWcf référentiel et demandez à votre infrastructure DI d'utiliser cette implémentation au lieu de la ProductsRepositorySql qui irait maintenant au service Web.

+0

Merci Darin. Configurera une application distincte pour héberger les services WCF. Question - Je prévoyais d'aller avec de vieux ASMX plaine depuis le côté db ses requêtes simples avec une logique métier sur le dessus. Puis a commencé à regarder les services de données WCF. Serait-ce plus simple compte tenu de la portée d'aller avec asmx? Aussi, ProductsRepositoryWCF me donnerait un coup de performance (du côté de l'application web). Devrais-je conserver les deux et continuer à utiliser ProductsRepositorySQL pour l'application Web? Je voudrais le garder comme base de code pour la maintenabilité. Merci encore. – user275157