Iniettare le dipendenze in un WebAPI con l’Unità

Ho un WebAPI controller che (dovrebbe) assomiglia a questo:

public class MyController : ApiController
{
    private IRepository repository;

    public MyController(IRepository repository) 
    {
        this.repository = repositor;
    }

    //REST implementations
}

WebApiConfig è configurato così:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        //Unity configuration
        var container = new UnityContainer();
        container
            .RegisterType<IRepository , CustomRepository>();
        config.DependencyResolver = new UnityResolver(container);

        //Web API routes
        //CORS
    }
}

quindi in Global.asax.cs ho qualcosa di simile:

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }

    //CORS
    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        //some CORS config
    } 
}

e finalmente ho un Startup.cs:

[assembly: OwinStartup(typeof(Path.To.Startup))]
namespace ZeroCode.ConfigurazioneServizio.Web.Api
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            new Mapping().Bootstrap();
        }
    }
}

A me sembra tutto ok, il codice costruisce e sono in grado di lanciare il controller, ma non appena faccio una richiesta ottengo errore causa costruttore senza parametri non è presente.
Così ho aggiunto il costruttore di default, ma questo verrà creata un’istanza del controller, in modo IRepository non potrà mai essere iniettato.

Ho cercato una possibile soluzione. Uno di loro ha cercato di attuare IHttpControllerActivator e così ho realizzato qualcosa di simile a questo:

public class UnityHttpControllerActivator : IHttpControllerActivator
{
    private IUnityContainer _container;

    public UnityHttpControllerActivator(IUnityContainer container)
    {
        _container = container;
    }

    public IHttpController Create(System.Net.Http.HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
    {
        return (IHttpController)_container.Resolve(controllerType);
    }
}

A questo punto ho modificato il WebApiConfig.cs inserimento di questa linea

config.Services.Replace(typeof(IHttpControllerActivator), new UnityHttpControllerActivator(container));

subito dopo il config.DependencyResolver ma questo non risolve il problema e viene generata un’eccezione all’interno del Create metodo. Non so cosa altro posso fare.

InformationsquelleAutor BAD_SEED | 2015-11-24



6 Replies
  1. 13

    C’è un bel po ‘ di Pacchetti Nuget – Unità.Webapi. Se si aggiunge che, si può semplicemente collegare il vostro contenitore nel tuo HttpConfiguration

    public static void Register(HttpConfiguration config)
    {
        //Unity configuration
        var container = new UnityContainer();
        container.RegisterType<IRepository , CustomRepository>();
        config.DependencyResolver = new UnityResolver(container);
    
        //this
        config.DependencyResolver = new UnityDependencyResolver(container);
    
        //Web API routes
        //CORS
    }

    Allora si può ignorare la categoria “extra” e il web.config modifiche.

    • Nulla cambia. Ho ottenuto un errore all’interno del Create metodo, sollevare un ResolutionFailedException.
  2. 2

    Con la versione 5 o superiore per l’unità, è necessario aggiungere il Unità.AspNet.WebApi pacchetto NuGet. Poi si può semplicemente seguire le istruzioni nel pacchetto NuGet per registrare i tuoi tipi e registrare il resolver di dipendenza come il seguente:

    using Unity.AspNet.WebApi;
    config.DependencyResolver =  new UnityDependencyResolver(container);

    Link per il pacchetto NuGet: https://github.com/unitycontainer/aspnet-webapi

  3. 1

    In 3 fasi :

    1. Registro
    2. Risolvere
    3. Link resolver per GlobalConfiguration

    Sembra di non aver aggiunto la risoluzione di codice e non soluzioni di cui sopra.

    Aggiungere questa riga prima di fissare DependencyResolver per GlobalConfiguration.

    DependencyResolver.SetResolver(new UnityDependencyResolver(container));
  4. 0

    È necessario impostare l’Unità come la dipendenza resolver per WebAPI.

    Aggiungere il seguente pacchetto NuGet per il progetto: https://www.nuget.org/packages/Unity.WebAPI/

    E quindi configurare WebAPI utilizzare il sistema di risoluzione aggiungendo il seguente WebApiConfig.cs

            GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
    • Nulla cambia. Ho ottenuto un errore all’interno del Create metodo, sollevare un ResolutionFailedException.
  5. 0

    Ho avuto lo stesso problema. Per me la soluzione a questo errore esatto è che tutti gli altri controller costruttori, inoltre, è stato caricato in fase di richiesta.
    E uno di loro non aveva un valido parametro nel costruttore. Quindi non è stato registrato con l’Unità.

    Così ho preso la risoluzione di fallire dall’Unità.

    Ma dopo di fissaggio che altri controller di tutto ha funzionato fin.

Lascia un commento