Произошла ошибка при попытке создать контроллер типа "ProductsController". Убедитесь, что у контроллера есть открытый конструктор без параметров
Я использую StructureMap для регистрации служб для примера Web API API AdevntureWork 4.6.2, когда вызываю конечную точку http://localhost:xxx/api/v1/products/all, и выдается сообщение об ошибке, как показано ниже
Произошла ошибка при попытке создать контроллер типа "ProductsController". Убедитесь, что у контроллера есть открытый конструктор без параметров.
System.InvalidOperationException в System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(запрос HttpRequestMessage, HttpControllerDescriptor controllerDescriptor, Type controllerType) в System.Web.Http.Control.HextPlayerHortController(Http.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, которую я разместил в отдельном вопросе.