Domanda

Sto cercando di impostare la struttura della struttura ver 3.0.5.0 con API Web 2.

Ho seguito questa implementazione: Configurazione dell'iniezione di dipendenzacon API ASP.NET 2.1

Tuttavia, sto ottenendo questo errore quando fai un passo contro il mio complexescontroller:

Si è verificato un errore durante il tentativo di creare un controller di tipo 'ComplexEscontroller'.Assicurarsi che il controller abbia un costruttore pubblico senza parametri.

Qualcuno può vedere cosa c'è di sbagliato nella mia configurazione StructureMap?Il metodo Crea non viene mai chiamato.

Questa è la mia implementazione:

public class StructureMapControllerActivator : IHttpControllerActivator
{
    private readonly IContainer _container;

    public StructureMapControllerActivator(IContainer container)
    {
        if (container == null) throw new ArgumentNullException("container");
        _container = container;
    }

    public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
    {
        try
        {                
            var scopedContainer = _container.GetNestedContainer();
            scopedContainer.Inject(typeof(HttpRequestMessage), request);
            request.RegisterForDispose(scopedContainer);
            return (IHttpController)scopedContainer.GetInstance(controllerType);
        }
        catch (Exception e)
        {
            // TODO : Logging
            throw e;
        }
    }
}
.

Questo metodo è nel mio avvio ...

public void InitializeContainer()
    {
        // STRUCTURE MAP
        Container container = new Container();
        GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new StructureMapControllerActivator(container));

        container.Configure(x => x.For<IForumRepository>().Use<ForumRepository>());
        container.Configure(x => x.For<IComplexRepository>().Use<ComplexRepository>());        
    }
.

.. E questo è il controller:

 public class ComplexesController : ApiController
{

    private IComplexRepository _repo;

    public ComplexesController(IComplexRepository repo)
    {
        _repo = repo;
    }

    // GET: api/Complexes
    public IList<Complex> GetComplexes()
    {
        var complexes = _repo.GetList();
        return complexes;
    }
    ...
.

La mia classe di avvio completa

[assembly: OwinStartup(typeof(AngularJSAuthentication.API.Startup))]
namespace AngularJSAuthentication.API
{
  public class Startup
   {
    public void Configuration(IAppBuilder app)
    {
        HttpConfiguration config = new HttpConfiguration();
        WebApiConfig.Register(config);
        app.UseWebApi(config);
    }

  }
}
.

È stato utile?

Soluzione

Il problema qui è che stai registrando il tuo attivatore del servizio con un oggetto globale di configurazione e non il tuo oggetto httpconfiguration.In questo scenario l'oggetto GlobalConfiguration Global non viene mai utilizzato come sostituito dall'oggetto HTTPConfiguration.Per risolvere il tuo problema dovresti sostituire il tuo metodo InitializeContainer () con quanto segue.

public void InitializeContainer(HttpConfiguration config)
    {
        // STRUCTURE MAP
        Container container = new Container();
        config.Services.Replace(typeof(IHttpControllerActivator), new StructureMapControllerActivator(container));

        container.Configure(x => x.For<IForumRepository>().Use<ForumRepository>());
        container.Configure(x => x.For<IComplexRepository>().Use<ComplexRepository>());        
    }
.

Dovresti quindi passare l'oggetto HTTPConfiguration dalla classe di avvio al nuovo metodo InitializeContainer ().

Spero che questo aiuti.

-b

Altri suggerimenti

Sto cercando di ottenere una solida comprensione del ciclo di vita completo.Penso che la mia configurazione possa essere leggermente diversa da quanto sopra.Ecco cosa ha funzionato per me.

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {                       
        var config = new HttpConfiguration();
        var container = IocConfig.Setup();

        // Allow a controller to be declared without a parameterless constructor
        config.DependencyResolver = new DependencyResolver(container);

        config.Services.Add( typeof(IExceptionLogger), new GlobalExceptionLogger( container.GetInstance<ILoggingService>()));

        // Web API routes
        config.MapHttpAttributeRoutes();

        // Setup Authentication
        ConfigureOAuth(app, container);

        var corsOptions = CorsOptions.AllowAll;

        app.UseCors(corsOptions);

        // Add ASP.Net Web API to OWIN pipeline
        app.UseWebApi(config);
    }
}
.

Ha funzionato dopo aver aggiunto questa linea:

// Allow a controller to be declared without a parameterless constructor
config.DependencyResolver = new DependencyResolver(container);
.

Devi ottenere che il mio contenitore VAR carichi da una classe statica chiamata Iocconfig con un metodo di configurazione statico.È qui che le interfacce sono mappate alle loro implementazioni concrete.

Inoltre, puoi probabilmente ignorare la linea GlobalExceptionLogger se vuoi usare il mio esempio completo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top