2010-10-30 5 views
2

Par souci de simplicité, permet de dire que j'ai la classe Controller base abstraite suivante:MVC Résumé de base du contrôleur Remplacer type de paramètre pour modelbinding

public abstract class RESTController : Controller 
{  
    public abstract JsonResult List(); 
    public abstract JsonResult Get(Guid id); 
    public abstract JsonResult Create(object obj); 
    public abstract JsonResult Update(object obj); 
    public abstract JsonResult Delete(Guid Id); 
} 

Pour les Créer & méthodes de mise à jour, je veux non seulement de passer outre la méthode, mais aussi le type du paramètre.

En général, j'utiliseraient des génériques comme ceci:

public abstract JsonResult Create<T>(T obj); 

Cependant ceci est une action MVC, et il n'y a aucun moyen de spécifier des paramètres de type.

Quelles sont mes options? Si je le laisse comme (object obj) le classeur modèle MVC fonctionnera-t-il correctement?

var model = obj as MyViewModel; 

Ce n'est pas très propre dans tous les cas. Toute aide serait appréciée.

Répondre

6

Que diriez-vous quelque chose entre les lignes:

public abstract class RESTController<T> : Controller 
{  
    public abstract JsonResult List(); 
    public abstract JsonResult Get(Guid id); 
    public abstract JsonResult Create(T obj); 
    public abstract JsonResult Update(T obj); 
    public abstract JsonResult Delete(Guid Id); 
} 

et lors de la substitution:

public FooController: RESTController<Foo> 
{ 
    ... 
    public override JsonResult Create(Foo obj) 
    { 
     throw new NotImplementedException(); 
    } 
    ... 
} 
+0

Wow, je me sens stupide. Merci ... –

0

Si vous voulez quelque chose d'un peu plus étoffée, vous pouvez essayer d'utiliser quelque chose le long des lignes de ce qui suit . J'utilise Onion Architecture et Repository Pattern, avec IoC, et DI. IEntity fournit simplement l'accès au champ Id de l'entité (Je suppose Entity Framework Code d'abord ici, avec Entity.Id comme clé primaire pour chaque entité, tandis que EntityId désignerait une clé étrangère sur une autre table).

Les actions sont virtuelles pour permettre aux classes dérivées de les remplacer si nécessaire, et le référentiel est défini sur protected, afin que la classe dérivée puisse également extraire du référentiel pour l'entité. Cela fonctionne avec un référentiel CRUD basique, mais pourrait être remplacé par un agrégat pour permettre plus de fonctionnalités.

using System; 
using System.Web.Mvc; 
using MySolution.Core.Interfaces.EntityFramework; 
using MySolution.Core.Interfaces.Repositories; 

namespace MySolution.Ux.Web.Site.Primitives 
{ 
    /// <summary> 
    ///  Provides mechanisms for performing CRUD operations on entities within a RESTful environment. 
    /// </summary> 
    /// <typeparam name="TEntity">The type of the entity.</typeparam> 
    public abstract class CrudController<TEntity> : Controller 
     where TEntity : class, IEntity, new() 
    { 
     /// <summary> 
     ///  The repository to use for CRUD operations on the entity. Derived classes 
     ///  also have access to this repository so that the virtual actions can be 
     ///  overridden with custom implementations. 
     /// </summary> 
     protected readonly IRepository<TEntity> Repository; 

     /// <summary> 
     ///  Initialises a new instance of the <see cref="CrudController{TEntity}"/> class. 
     /// </summary> 
     /// <param name="repository">The repository.</param> 
     protected CrudController(IRepository<TEntity> repository) 
     { 
      // Instantiate the controller's repository. 
      Repository = repository; 
     } 

     /// <summary> 
     ///  Lists this specified entities within the data store. 
     /// </summary> 
     /// <returns>A JSON formatted list of the entities retrieved.</returns> 
     [HttpGet] 
     public virtual JsonResult List() 
     { 
      try 
      { 
       return Json(Repository.GetAll(), JsonRequestBehavior.AllowGet); 
      } 
      catch (Exception e) 
      { 
       return Json(e.Message, JsonRequestBehavior.AllowGet); 
      } 

     } 

     /// <summary> 
     ///  Gets a specific entity within the data store. 
     /// </summary> 
     /// <returns>A JSON formatted version of the entity retrieved.</returns> 
     [HttpGet] 
     public virtual JsonResult Get(Guid id) 
     { 
      try 
      { 
       return Json(Repository.Get(id), JsonRequestBehavior.AllowGet); 
      } 
      catch (Exception e) 
      { 
       // An error has occured. Handle the exceptions as needed and return feedback via JSON. 
       return Json(e.Message, JsonRequestBehavior.AllowGet); 
      } 

     } 

     /// <summary> 
     ///  Creates a specific entity within the data store. 
     /// </summary> 
     /// <returns>A JSON formatted version of the entity created.</returns> 
     [HttpPost] 
     public virtual JsonResult Create(TEntity entity) 
     { 
      try 
      { 
       Repository.Add(entity); 
       Repository.Save(); 
       return Json(entity); 
      } 
      catch (Exception e) 
      { 
       // An error has occured. Handle the exceptions as needed and return feedback via JSON. 
       return Json(e.Message); 
      } 

     } 

     /// <summary> 
     ///  Updates a specific entity within the data store. 
     /// </summary> 
     /// <returns>A JSON formatted version of the entity updated.</returns> 
     [HttpPut] 
     public virtual JsonResult Update(TEntity entity) 
     { 
      try 
      { 
       Repository.Update(entity); 
       Repository.Save(); 
       return Json(entity); 
      } 
      catch (Exception e) 
      { 
       // An error has occured. Handle the exceptions as needed and return feedback via JSON. 
       return Json(e.Message); 
      } 

     } 

     /// <summary> 
     ///  Deletes a specific entity from the data store. 
     /// </summary> 
     /// <returns>A JSON formatted version of the entity deleted.</returns> 
     [HttpDelete] 
     public virtual JsonResult Delete(Guid id) 
     { 
      try 
      { 
       var entity = Repository.Get(id); 
       Repository.Remove(entity); 
       Repository.Save(); 
       return Json(entity); 
      } 
      catch (Exception e) 
      { 
       // An error has occured. Handle the exceptions as needed and return feedback via JSON. 
       return Json(e.Message); 
      } 

     } 
    } 
} 
+0

Sympa, juste une question comment voulez-vous router ces méthodes disons que 3 classes dérivent du contrôleur abstrait: Produit, Client, Devise qui sont les noms de classes. Avec les routes suivantes: api/v1/produits api/v1/clients api/v1/devises. Veuillez noter la convention de nommage –

Questions connexes