Pregunta

Estoy tratando de configurar la estructura Mapa Ver 3.0.5.0 con la API WEB 2.

He seguido esta implementación: Configuración de la inyección de dependenciacon ASP.NET WEB API 2.1

Sin embargo, estoy obteniendo este error al hacer una entrada contra mi complejoController:

Se produjo un error al intentar crear un controlador de tipo 'complexcontroller'.Asegúrese de que el controlador tenga un constructor público sin parámetros.

¿Puede alguien ver qué está mal con mi configuración de StructureMap?El método de creación nunca se llama.

Esta es mi implementación:

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;
        }
    }
}

Este método está en mi inicio ...

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>());        
    }

.. y este es el controlador:

 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;
    }
    ...

mi clase de inicio completo

[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);
    }

  }
}

¿Fue útil?

Solución

El problema aquí es que está registrando su activador de servicio con un objeto globalConfiguration y no su objeto HTTPConfiguration.En este escenario, el objeto globalconfiguration nunca se usa, ya que se reemplaza por el objeto HTTPConfiguration.Para resolver su problema, debe reemplazar su método inicializecontainer () con lo siguiente.

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>());        
    }

A continuación, debe pasar el objeto HTTPConfiguration desde su clase de inicio al nuevo método InitialInContainer ().

Espero que esto ayude.

-b

Otros consejos

Estoy tratando de obtener una comprensión sólida del ciclo de vida completo.Creo que mi configuración puede ser ligeramente diferente a lo anterior.Aquí está lo que funcionó para mí.

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);
    }
}

funcionó después de haber agregado esta línea:

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

Debe obtener que mis cargas de contenedor VAR de una clase estática llamada IOCCONFIG con un método de configuración estática.Aquí es donde las interfaces se asignan a sus implementaciones concretas.

Además, probablemente puede ignorar la línea de GlobalExceptionlogger si desea usar mi ejemplo completo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top