2010-08-05 28 views
12

Estoy pensando en implementar un controlador genérico en ASP.NET MVC.asp.net controlador genérico mvc

PlatformObjectController<T> 

donde T es un objeto de plataforma (generado).

¿Esto es posible? ¿Hay experiencia/documentación?

Una pregunta relacionada, por ejemplo, es cómo son las URL resultantes.

+0

Usted tendría que configurar rutas para cada t' '... o realizar algo de magia de búsqueda en tiempo de ejecución. Hay implicaciones de rendimiento para esto, pero aparte de eso, parece que sería una buena idea. – bzlm

Respuesta

18

sí lo es, simplemente no puede utilizarlo directamente, sino que se puede heredar y utilizar los niño

aquí es que yo uso:

 public class Cruder<TEntity, TInput> : Controller 
     where TInput : new() 
     where TEntity : new() 
    { 
     protected readonly IRepo<TEntity> repo; 
     private readonly IBuilder<TEntity, TInput> builder; 


     public Cruder(IRepo<TEntity> repo, IBuilder<TEntity, TInput> builder) 
     { 
      this.repo = repo; 
      this.builder = builder; 
     } 

     public virtual ActionResult Index(int? page) 
     { 
      return View(repo.GetPageable(page ?? 1, 5)); 
     } 

     public ActionResult Create() 
     { 
      return View(builder.BuildInput(new TEntity())); 
     } 

     [HttpPost] 
     public ActionResult Create(TInput o) 
     { 
      if (!ModelState.IsValid) 
       return View(o); 
      repo.Insert(builder.BuilEntity(o)); 
      return RedirectToAction("index"); 
     } 
    } 

y usos:

public class FieldController : Cruder<Field,FieldInput> 
    { 
     public FieldController(IRepo<Field> repo, IBuilder<Field, FieldInput> builder) 
      : base(repo, builder) 
     { 
     } 
    } 

    public class MeasureController : Cruder<Measure, MeasureInput> 
    { 
     public MeasureController(IRepo<Measure> repo, IBuilder<Measure, MeasureInput> builder) : base(repo, builder) 
     { 
     } 
    } 

    public class DistrictController : Cruder<District, DistrictInput> 
    { 
     public DistrictController(IRepo<District> repo, IBuilder<District, DistrictInput> builder) : base(repo, builder) 
     { 
     } 
    } 

    public class PerfecterController : Cruder<Perfecter, PerfecterInput> 
    { 
     public PerfecterController(IRepo<Perfecter> repo, IBuilder<Perfecter, PerfecterInput> builder) : base(repo, builder) 
     { 
     } 
    } 

el código está aquí: http://code.google.com/p/asms-md/source/browse/trunk/WebUI/Controllers/FieldController.cs

actualización:

utilizando este enfoque aquí ahora: http://prodinner.codeplex.com

+0

Ok, entonces mi problema es solucionable. Si se genera el tipo para el parámetro tipo, y el controlador base se implementa genéricamente, todo lo que tengo que hacer es generar el controlador derivado para cada tipo que quiera usar como parámetro de tipo. Eso es tan simple como puede ser. ¡Genial! –

Cuestiones relacionadas