簡體   English   中英

如何在新的ASP.NET Core中調用Web API非默認構造函數

[英]How can I call Web API non-default constructor in new ASP.NET Core

我創建了一個使用Web API的項目。 我想讓控制器的構造函數接受constructor注入的一個參數。 在啟動時,我添加了以下內容:

Startup.cs:

public class Startup
{
    // Other codes ommitted

    public void ConfigureServices(IServiceCollection services)
    {
        // Other codes ommitted

        // Add application services.
        services.AddTransient<IStudentDataAccess, StudentDataAccess>();
    }
}

在控制器中,我有以下構造函數:

ValuesController:

[Route("api/[controller]")]
public class ValuesController : Controller
{
    private IStudentDataAccess _studentDataAccess;

    public ValuesController(IStudentDataAccess studentDataAccess)
    {
        _studentDataAccess = studentDataAccess;
    }

    // GET: api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        IStudentLogic studentLogic = new StudentLogic(_studentDataAccess);
        return new string[] { "value1", "value2" };
    }
}

但是沒有調用構造函數。 我看到對於以前的ASP.NET版本,您可以執行此操作。 如何在新的ASP.NET中做到這一點? 還是當ASP.NET解析IStudentDataAccess時如何傳遞參數?

更新:

好的,我認為問題是我的StudentDataAccess類具有一個接受IDbContext的非默認構造函數。 如果刪除構造函數,則可以正常工作。 但是我需要能夠在StudentDataAccess的構造函數中傳遞IDbContext。 我嘗試在ConfigureServices中添加此代碼:

services.AddTransient<IDbContext, TestDbContext>();

但是構造函數不會受到斷點的影響。 這是StudentDataAccess的聲明:

public class StudentDataAccess : IStudentDataAccess
{
    private IDbContext _context;

    public StudentDataAccess(IDbContext context)
    {
        _context = context;
    }
}

IDbContext只是一個沒有成員的接口。

您所顯示的內容不正確。

要將自己的臨時服務添加到控制器:

  • 定義你的界面
  • 定義實現接口的類
  • 添加services.AddTransient<IYourInterface, YourClass>(); Startup.cs中 ConfigureServices
  • 向您的控制器添加一個構造函數,以將您的服務作為參數接收。 確保只有一個構造函數。

我的最小工作示例:

Startup.cs:

using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

namespace WebApplication5
{
    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.AddTransient<IStudentDataAccess, StudentDataAccess>();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            app.UseIISPlatformHandler();
            app.UseMvc();
        }
        public static void Main(string[] args) => WebApplication.Run<Startup>(args);
    }
}

ValuesController.cs:

using Microsoft.AspNet.Mvc;
using System.Collections.Generic;

namespace WebApplication5.Controllers
{
    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        private IStudentDataAccess _studentDataAccess;

        public ValuesController(IStudentDataAccess studentDataAccess)
        {
            _studentDataAccess = studentDataAccess;
        }

        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value", _studentDataAccess.Hello() };
        }
    }
}

StudentDataAccess.cs:

namespace WebApplication5
{
    public interface IStudentDataAccess
    {
        string Hello();
    }

    public class StudentDataAccess : IStudentDataAccess
    {
        public string Hello()
        {
            return "Hello from Service";
        }
    }
}

結果:

["value","Hello from Service"]

嘗試放入FromServicesAttribute,例如:

public ValuesController([FromServices]IStudentDataAccess studentDataAccess)
{
    _studentDataAccess = studentDataAccess;
}

這對我有用:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM