![](/img/trans.png)
[英]ASP.NET Core is using non-default constructor if no public default constructor found
[英]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.