F # .NET Core 2.1 простое приложение: контроллеры не регистрируются - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь использовать F # с .NET Core 2.1 для создания простого приложения CRUD, но ни один из контроллеров не регистрируется.Я не вижу ни одного из контроллеров в Swagger, а сам контроллер не запускается.

Я ценю любую помощь или подсказку.

Startup.fs

namespace SimpleCms

type Startup private () =
    let mutable configuration : IConfigurationRoot = null

    member this.Configuration
        with get () = configuration
        and private set (value) = configuration <- value

    new(env : IHostingEnvironment) as this =
        Startup()
        then 
            let builder =
                ConfigurationBuilder()
                    .SetBasePath(env.ContentRootPath)
                    .AddJsonFile("appsettings.json", optional = false, reloadOnChange = true)
                    .AddJsonFile(sprintf "appsettings.%s.json" env.EnvironmentName, optional = true)
                    .AddEnvironmentVariables()

            this.Configuration <- builder.Build()

    // This method gets called by the runtime. Use this method to add services to the container.
    member this.ConfigureServices(services : IServiceCollection) =

        services.AddLogging() |> ignore

        services.AddSwaggerGen(fun x ->
            x.SwaggerDoc("v1", new Info(Title = "SimpleCms", Version = "v1")) |> ignore)
            |> ignore

        services.AddMvcCore() |> ignore

        services.AddMvc() |> ignore

        let container =
            new Container(fun opt -> 

            opt.Scan(fun x -> 
                x.AssemblyContainingType(typeof<Startup>)
                x.Assembly("Dal")
                x.Assembly("Logic")
                x.WithDefaultConventions() |> ignore)

            opt.For<LiteDatabase>().Use(new LiteDatabase("Filename=database.db")) |> ignore

            opt.Populate(services) |> ignore)

        container.GetInstance<IServiceProvider>()

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    member this.Configure(app : IApplicationBuilder, env : IHostingEnvironment) =
        app.UseSwagger() |> ignore

        app.UseSwaggerUI(fun x ->
            x.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1") |> ignore) |> ignore

        app.UseMvc(fun x ->
            x.MapRoute("default", "{controller=Home}/{action=Index}") |> ignore) |> ignore

HomeController.fs

namespace SimpleCms.Controllers

open Microsoft.AspNetCore.Mvc

[<Route("")>]
type HomeController() =
    inherit Controller()

    [<Route("")>]
    [<HttpGet>]
    member this.Index() =
        Ok("Hello World!")

Полный код

URL репо

1 Ответ

0 голосов
/ 24 декабря 2018

Ваша проблема в интерфейсе IPostController.Удалите это, и Swagger возьмет PostController.

Например:

[<Route("api/[controller]")>]
[<ApiController>]
type PostController(logic : IPostLogic) =
    inherit Controller()
    member this.logic = logic

        [<Route("")>]
        [<HttpGet>]
        member this.GetAll() = 
            this.logic.GetAll()

//etc

Что заставит Swagger показать это:

enter image description here

Примечание : для ASP.NET Core 2.1 и выше, вы не должны указывать версию пакета Microsoft.AspNetCore.All, ваш файл fsproj должен содержать вместо этого:

<PackageReference Include="Microsoft.AspNetCore.All" />

Это, в свою очередь, означает, что вы должны использовать версию 2.1.1 Microsoft.Extensions.Logging.Debug.

Наконец, вы используете действительно старую версию Swashbuckle.AspNetCore.Я предлагаю вам обновить это тоже.

...