Произошла ошибка при попытке создать контроллер типа «ProductsController».Убедитесь, что у контроллера есть открытый конструктор без параметров - PullRequest
0 голосов
/ 10 декабря 2018

Я использую StructureMap для регистрации служб для примера веб-API AdevntureWork Project 4.6.2, при каждом вызове конечной точки http://localhost:xxx/api/v1/products/all выдается ошибка, подобная приведенной ниже

Ошибка при попыткесоздать контроллер типа «ProductsController».Убедитесь, что у контроллера есть открытый конструктор без параметров.

System.InvalidOperationException в System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (запрос HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Тип controllerType) в System.Web.Htttt.ControlControlControlControlControlControlWeb.Http.Dispatcher.HttpControllerDispatcher.d__15.MoveNext ()

Код приведен ниже:

Файл Startup.cs:

     public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=316888
        var config = new HttpConfiguration();

        config.AddApiVersioning(opt => opt.AssumeDefaultVersionWhenUnspecified = true);

        var constraintResolver = new DefaultInlineConstraintResolver()
        {
            ConstraintMap =
            {
                ["apiVersion"] = typeof( ApiVersionRouteConstraint )
            }
        };
        config.MapHttpAttributeRoutes(constraintResolver);

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
            );

        var container = new Container(x =>
        {
            x.AddRegistry<IoCRegistry>();
        });


        Mapper.Initialize(x =>
        {
            x.AddProfile<ProductProfile>();
        });



        config.DependencyResolver = new StructureMapWebApiDependencyResolver(container);

        config.Filters.Add(new ApiExceptionFilterAttribute());

        app.Use<ErrorHandlingMiddleware>(config.DependencyResolver.GetService(typeof(ILogger<ErrorHandlingMiddleware>)));
        config.EnableSwagger(c =>
        {
            c.SingleApiVersion("1", "AdventureWork.API");
            c.DescribeAllEnumsAsStrings();
            c.DocumentFilter<SwaggerRouteVersion>();
        })
        .EnableSwaggerUi();

        app.UseWebApi(config);
    }
}

IoCRegitry.Файл CS выглядит так:

public class IoCRegistry : Registry
{
    public IoCRegistry()
    {
        Scan(_ =>
        {
            _.TheCallingAssembly();
            _.Assembly("AdventureWork.DTO");
            _.Assembly("AdventureWork.EFProvider");
            _.Assembly("AdventureWork.Objects");
            _.Assembly("AdventureWork.Repo");
            _.Assembly("AdventureWork.Manager");
            _.LookForRegistries();
            _.WithDefaultConventions();
        });

        AdventureWorkRepositoryDbContextOptions contextOptions = new AdventureWorkRepositoryDbContextOptions(ConfigurationManager.AppSettings["DBConnectionString"].ToString());

        For<IAdventureWorkRepositoryDbContextOptions>().Singleton().Use(contextOptions);
        For<AdventureWorkRepositoryDbContextOptions>().Singleton().Use(contextOptions);
        For<IDbContextFactory<AdventureWorkRepositoryDbContext>>().Use<AdventureWorkRepositoryDbContextFactory>();
        For<IProductManager>().Use<ProductManager>();

        For<IRepository<Product>>().Singleton().Use<Repository<Product>>();

        For<IMyDbContext>().Singleton()
        .Use<MyDbContext>().Ctor<string>("connectionString").Is(ConfigurationManager.AppSettings["DBConnectionString"].ToString());

    }
}

ProductsController.cs Файл:

 [RoutePrefix("api/v{version:apiVersion}/products")]
public class ProductsController : ApiController
{
    private readonly IProductManager _manager;
    private readonly ILogger<ProductsController> logger;

    public ProductsController(IProductManager manager,ILogger<ProductsController> logger)
    {
        _manager = manager;
        this.logger = logger;
    }

    // GET api/<controller>
    [HttpGet, Route("all")]
    public async Task<IEnumerable<Product>> Get()
    {
        var products = await _manager.GetProducts();
        return products;

    } 
}

Кажется, в реестре сервисов есть ошибка, которую я не могу идентифицировать, кто-нибудь может мне помочьнайдите его.

** Также стоит упомянуть, что DI Structure Map DI работает на проекте .NET Core 2.1 с тем же хранилищем, но встречает другую ошибку с DBContextFactory, которую я разместил в отдельном вопросе.

...