Em asp.net mvc é possível fazer um controlador genérico?

Eu estou tentando criar um controlador genérico, ou seja:

public class MyController : Controller where T : SomeType { ... } 

No entanto, quando tento usá-lo, estou correndo para esse erro em todos os lugares …

O nome do controlador deve terminar em ‘Controller’

Então, minha pergunta, é possível fazer um controlador genérico em asp.net mvc?

Obrigado!

Se eu entendi corretamente, o que você está tentando fazer é encaminhar todas as solicitações para um determinado modelo por meio de um controlador genérico do tipo T.

Você gostaria que o T variasse com base no modelo solicitado.

Você gostaria /Product/Index para triggersr MyController.Index()

Isso pode ser feito escrevendo seu próprio IControllerFactory e implementando o método CreateController forma:

 public IController CreateController(RequestContext requestContext, string controllerName) { Type controllerType = Type.GetType("MyController") .MakeGenericType(Type.GetType(controllerName)); return Activator.CreateInstance(controllerType) as IController; } 

Sim, você pode, tudo bem e eu usei eles mesmos.

O que você precisa garantir é que quando você herda do MyController você ainda finalizar o nome do tipo com o controlador:

 public class FooController : MyController { ... } 

A fábrica do controlador padrão usa “convenção” em torno dos nomes dos controladores quando está tentando encontrar um controlador para despachar a solicitação. Você poderia replace essa funcionalidade de pesquisa se quisesse, o que poderia permitir que seu controlador genérico funcionasse.

Este artigo do MSDN …

http://msdn.microsoft.com/pt-br/magazine/dd695917.aspx

… tem uma boa descrição do que está acontecendo.

Esta é uma duplicata do controlador genérico asp.net mvc que realmente contém a resposta correta. A resposta de Jeff Fritz não é absolutamente correta. Criar seu próprio IControllerFactory não passará da limitação em ExpressionHelper.GetRouteValuesFromExpression que está gerando o erro que você está vendo. Implementar seu próprio IControllerFactory ainda lhe deixará com erros sempre que você chamar RedirectToAction, BuildUrlFromExpression, ActionLink, RenderAction, BeginForm, qualquer método que os chamar.

O que é interessante para mim é que a “restrição por convenção” da Microsoft já é imposta pela restrição “onde TController: Controller” é colocada sobre o tipo no método ExpressionHelper.GetRouteValuesFromExpression. Nenhum genérico jamais satisfará a validação da convenção:

 string controllerName = typeof(TController).Name; if (!controllerName.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)) { throw new ArgumentException(MvcResources.ExpressionHelper_TargetMustEndInController, "action"); } 

a menos que seja herdada por uma class que termina em “Controller” porque typeof (AnyGeneric) .Name nunca terminará com “Controller”.

Se eu fosse você, pegaria a fonte MVC e criaria um projeto MVC de teste com o código fonte para que você possa examinar onde a exceção é gerada e ver o que você pode fazer sobre sua ideia genérica e a convenção de nomenclatura “* controller” imposta .