2016-03-05 45 views
2

我創建了一個使用Web API的項目。我想讓控制器有一個構造函數,它接受contsructor注入的一個參數。在啓動時,我加了這一點:如何在新的ASP.NET Core中調用Web API非默認構造函數

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時傳遞參數?

UPDATE:

好吧,我認爲這個問題是我StudentDataAccess類有一個接受IDbContext非默認構造函數。如果我刪除構造函數,它的工作原理。但我需要能夠在StudentDataAccess的構造函數中傳遞一個IDbContext。我試着在ConfigureServices中添加這個:

services.AddTransient<IDbContext, TestDbContext>(); 

但是構造函數沒有被斷點擊中。這裏是StudentDataAccess聲明:

public class StudentDataAccess : IStudentDataAccess 
{ 
    private IDbContext _context; 

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

IDbContext只是沒有成員的接口。

+2

它應該工作。你的控制器來自'Microsoft.AspNet.Mvc.Controller'嗎?你有多個構造函數嗎?你有[最小,完整和可驗證的例子](http://stackoverflow.com/help/mcve)? –

+0

@Leonardo Herrera:它不幸。我不能在這裏複製所有內容,但我所做的是defaut Web API模板,使用一個參數創建了一個新的構造函數,在它上面放置了一個斷點,然後運行它。它沒有達到斷點。 –

+0

你*可以*創建一個MCVE。顯示你的控制器聲明。 – mason

回答

3

某些東西與您展示的內容不符。

爲了自己的臨時服務添加到您的控制器:

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

我最小的工作例如:

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"] 
+0

我嘗試了你的例子,它確實有效。在我的項目中,Interface和具體類都在不同的程序集中(但是StudentDataAccess肯定會實現IStudentDataAccess)。當這是設置時,構造函數沒有被擊中。但是當我將它們移到相同的程序集(在Startup.cs後面)時,它就可以工作。任何想法爲什麼這是?我有相同的代碼,只是不同的程序集。 –

+0

好吧,我認爲問題是我的StudentDataAccess類有一個接受IDbContext的非默認構造函數。如果我刪除構造函數,它的工作原理。但我需要能夠在StudentDataAccess的構造函數中傳遞一個IDbContext。你能告訴我如何? –

+0

我創建了一個新項目,即使StudentDataAccess沒有默認構造函數,它也可以工作。我需要追蹤我原來的問題上發生的事情,但正如你所說,這只是起作用。 –

1

嘗試把FromServicesAttribute,例如:

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

這個工作對我來說:)

+0

構造函數中不需要'FromServices'屬性。它用於行動。 – Fred