Infelizmente, você está errado sobre isso - presumo que posso compartilhar todos os meus atributos etc. entre a API da web e os controladores de mvc, então, aparentemente, não parece uma grande mudança para mim.
Muitos dos conceitos usados pela API da Web e MVC, embora semelhantes à primeira vista, na verdade não são compatíveis. Por exemplo, os atributos da API da Web são System.Web.Http.Filters.Filter
e os atributos MVC são System.Web.Mvc.Filter
- e não são intercambiáveis.
O mesmo se aplica a muitos outros conceitos - vinculação de modelo (mecanismos completamente diferentes), rotas (a API da Web usa HTTPRoutes e não Rotas, embora ambos operem na mesma RouteTable subjacente), resolvedor de dependências (não compatível) e muito mais - embora semelhante no superfície, são muito diferentes na prática. Além disso, a API Web não possui um conceito de áreas.
Em última análise, se tudo o que você está tentando alcançar é ter uma maneira "nova e moderna" de fornecer conteúdo JSON - pense duas vezes antes de seguir esse caminho. Eu certamente não recomendaria refatorar qualquer código existente, a menos que você realmente esteja pensando em abraçar HTTP e construir seu aplicativo de uma forma RESTful.
Tudo realmente depende do que você está construindo. Se você está iniciando um novo projeto e tudo que você precisa é servir algum JSON para facilitar seu aplicativo da web - desde que você esteja disposto a viver com algum código potencialmente duplicado (como o que mencionei acima), a API da Web pode ser facilmente hospedada dentro o mesmo projeto da ASP.NET MVC.
Eu só separaria a API da Web em um projeto separado se você for construir uma API adequada para seu serviço online - talvez para ser consumida por clientes externos ou por vários dispositivos - como abastecer seus aplicativos móveis.
IMO, segurança e implantação devem orientar sua decisão. Por exemplo, se seu aplicativo MVC usa autenticação de formulários, mas você está interessado em usar autenticação básica (com SSL) para sua API, projetos separados irão tornar sua vida mais fácil. Se você deseja hospedar seu site em www.example.com, mas hospedar sua API como api.example.com (em vez de www.example.com/api), projetos separados tornarão sua vida mais fácil. Se você separar seus projetos e subdominá-los de acordo e pretende alavancar sua própria API de seu aplicativo MVC, você terá que descobrir como lidar com o problema da política da mesma origem para chamadas do lado do cliente para sua API. Soluções comuns para isso são aproveitar jsonp ou CORS (de preferência, se você puder).
Atualização (26/03/2013): Suporte oficial para CORS chegando: http://aspnetwebstack.codeplex.com/wikipage?title=CORS%20support%20for%20ASP.NET%20Web%20API
fonte
Depois de algum grau de experiência (criação de API para apps e para mvc). Eu principalmente faço ambos.
Eu crio um projeto separado para chamadas de API que vêm de outros clientes ou outros dispositivos (aplicativos Android / IOS). Um dos motivos é porque a autenticação é diferente, é baseada em tokens (para mantê-la sem estado). Não quero misturar isso no meu aplicativo MVC.
Para minhas chamadas de api javascript / jquery para meu aplicativo mvc, gosto de manter as coisas simples, então incluo uma api da web dentro do meu aplicativo MVC. Não pretendo ter autenticação baseada em token com minhas chamadas de api javascript, porque hey, está no mesmo aplicativo. Posso apenas usar o
[authorize]
atributo em um endpoint de API, quando um usuário não estiver logado, ele não obterá os dados.Além disso, ao lidar com carrinhos de compras e você deseja armazenar o carrinho de compras de um usuário em uma sessão (enquanto não estiver conectado), você também precisa ter isso em sua API se adicionar / excluir produtos por meio de seu código javascript. Isso tornará sua API com estado, com certeza, mas também reduzirá a complexidade em sua MVC-API.
fonte
Steven do SimpleInjector (framework IoC) aconselha dois projetos separados: Qual é a diferença entre DependencyResolver.SetResolver e HttpConfiguration.DependencyResolver em WebAPI
fonte
Recentemente, fiz quase a mesma coisa: comecei com um novo projeto de aplicativo da web MVC 4 escolhendo o modelo de API da Web no VS2012.
Isso criará uma API da Web hospedada no mesmo aplicativo que o MVC.
Eu queria mover os ApiControllers para um projeto de biblioteca de classes separado. Isso foi bastante fácil, mas a solução estava um pouco escondida.
Em AssemblyInfo.cs do projeto MVC 4, adicione uma linha de código semelhante
Agora você precisa da classe LibraryRegistrator (sinta-se à vontade para nomeá-la como quiser)
No projeto MVC 4, também adicione referência à biblioteca Api.
Agora você pode adicionar controladores Api à sua própria biblioteca de classes separada (yourown.dll).
fonte
Mesmo se o seu projeto for tão complexo a ponto de justificar dois "front ends", eu ainda consideraria dividir o webapi em um projeto separado como último recurso. Você terá dores de cabeça de implantação e será difícil para um novato entender a estrutura de sua solução. Sem mencionar problemas de roteamento.
Meu objetivo seria manter o namespace system.web isolado em uma "camada de apresentação". Apesar do webapi não ser de apresentação, ele ainda faz parte da interface de seu aplicativo. Contanto que você mantenha a lógica em seu domínio e não em seus controladores, você não deve ter muitos problemas. Além disso, não se esqueça de fazer uso de Areas.
fonte
Além de configurar a DLL separada para o Web.Api.
Apenas uma sugestão:
Crie um método de classe a ser chamado em app_start
[assembly: WebActivatorEx.PostApplicationStartMethod (typeof (API.AppWebActivator), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethod (typeof (API.AppWebActivator), "Shutdown")]
Registre uma rota web.api dentro do método inicial
public static void Start () {GlobalConfiguration.Configure (WebApiConfig.Register); }
Referencie o projeto ao projeto da Web. para ativar o método inicial.
Espero que isto ajude.
fonte
Tentei dividir os controladores de API em um novo projeto. Tudo o que fiz foi criar um novo projeto de biblioteca, movi os controladores dentro da pasta chamada API. Em seguida, adicionou a referência do projeto de biblioteca ao projeto MVC.
A configuração da webAPI é deixada no próprio projeto MVC. Funciona bem.
fonte