ASP.NET WebApi : Iniciando com MVC4 - Parte 3

watch_later 10 de mar de 2014

Dependency Injection com Containers IoC  (Inversão de controle)


Uma dependência é um objeto ou uma interface que exige um outro objeto. Por exemplo, nestes artigos nós definimos uma classe BooksController que requer uma instância IBookRepository.


Este não é o melhor design, porque a chamada para o novo BookRepository é codificado na classe controller. Mais tarde, podemos querer mudar para outra aplicação de IBookRespository, em seguida, seria preciso alterar a implementação de BooksController. É melhor se o BooksController é vagamente dissociado de qualquer instância concreta de IBookRespoitory. 

Injeção de dependência resolve este problema. Com a injeção de dependência, um objeto não é responsável por criar suas próprias dependências. Em vez disso, o código que cria o objeto injeta a dependência, geralmente através de um parâmetro de construtor ou um método setter. 

Aqui está uma implementação revisada de BooksController:

public class BooksController : ApiController
{
    static IBookRepository _repository;
    public BooksController(IBookRepository repository)
    {
        if (repository == null)
        {
            throw new ArgumentNullException("repository");
        }
        _repository = repository;
    }
}

Um contêiner IoC é um componente de software que é responsável por criar dependências. Containers IoC fornecem Dependency Injection. Se você usar um contêiner IoC, então você não precisa conectar objetos diretamente no código. Vários Open-Source Containers IoC para o .NET estão disponíveis. O exemplo a seguir usa Unity, um contêiner IoC desenvolvido pela própira Microsoft Patterns & Practices. 

No Solution Explorer, clique duas vezes em Global.asax. Visual Studio abre o arquivo chamado Global.asax.cs, que é o arquivo de code-behind para o global. Este arquivo contém o código para manipular eventos em nível de aplicativo e de nível de sessão em ASP.NET. 

Adicionar um método estático denominado ConfigureApi à classe WebApiApplication. 

Adicione a seguinte usando instruções:

using Microsoft.Practices.Unity;
using WebAPI.Models;

Add the following implementation:

void ConfigureApi(HttpConfiguration config)
{
    var unity = new UnityContainer();
    unity.RegisterType<BooksController>();
    unity.RegisterType<IBookRepository, BookRepository>(
        new HierarchicalLifetimeManager());
    config.DependencyResolver = new IoCContainer(unity);
}

Agora modifique o Application_Start 

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
    ConfigureApi(GlobalConfiguration.Configuration);
    Database.SetInitializer(new BookInitializer());
}

Bom , até a próxima 
No próximo artigos iremos começar o crud 

Postagens da Mesma série :

Parte 1
Parte 2

Parte 3
Parte 4