2015-11-05 20 views
6

使用asp.net 5測試版-8,我有這樣的事情註冊爲一個服務:ASP.NET 5依賴注入 - [FromServices]屬性只能在控制器中工作嗎?

services.AddTransient<IMyClass, MyClass>(); 

當我在一個控制器使用上的屬性此屬性,myClass被設置爲IMyClass的實例。

public class HomeController : Controller 
{ 
    [FromServices] 
    public IMyClass myClass { get; set; } 

    public IActionResult Index() 
    { 
     //myClass is good 
     return View(); 
    } 
} 

然而,當我嘗試在不繼承Controller一個類來使用它,它似乎並沒有給myClass屬性設置爲IMyClass一個實例:

public class MyService 
{ 
    [FromServices] 
    public IMyClass myClass { get; set; } 

    public void DoSomething(){ 
     //myClass is null 
    } 
} 

這是預期的行爲?我如何在普通課程中注入我的依賴關係?

+0

'[FromServices]'不再支持屬性。 – Keith

回答

6

問題是,當你調用new MyService(),在ASP.NET 5依賴注入系統完全繞過。

爲了讓依賴關係注入到MyService,我們需要讓ASP.NET爲我們創建實例。

如果您想在控制器中使用MyService,您必須先註冊服務集合以及IMyClass

services.AddTransient<IMyClass, MyClass>(); 
services.AddTransient<MyService>(); 

在這種情況下,我選擇了使用構造器注入,所以我不作嘗試錯誤實例MyService自己:

public class MyService 
{ 
    public IMyClass myClass { get; set; } 

    public MyService(IMyClass myClass) 
    { 
     this.myClass = myClass; 
    } 

    public void DoSomething() 
    { 
     //myClass is null 
    } 
} 

現在,你可以自由地注入該服務爲您的控制器:

public class HomeController : Controller 
{ 
    [FromServices] 
    public MyService myService { get; set; } 

    public IActionResult Index() 
    { 
     // myService is not null, and it will have a IMyClass injected properly for you 
     return View(); 
    } 
} 

如果您想了解更多關於ASP.NET 5依賴注入系統,我在這裏做了一個視頻和博客文章:http://dotnetliberty.com/index.php/2015/10/15/asp-net-5-mvc6-dependency-injection-in-6-steps/

+2

'[FromServices]'已被棄用於屬性,並且不再需要在構造函數中使用。現在你需要一個構造函數來將'MyService'注入到'HomeController'中:'public HomeController(MyService myService)' – Keith

2

您可以使用構造函數注入較低級別類...

public class MyService 
{ 
    private readonly IMyClass _myClass; 

    public MyService(IMyClass myClass) 
    { 
     if (myClass == null) 
      throw new ArgumentNullException("myClass"); 
     _myClass = myClass; 
    } 

    public void DoSomething() 
    { 
     // Do something 
    } 
} 
+0

如何在不傳入IMyClass的情況下實例化MyService類? –

+0

DI容器將完成構造函數參數。控制器被實例化,它們的服務通過[FromServices]屬性實例化,然後通過構造器注入實例化下面的所有其他依賴項。你打算在哪裏實例化MyService? – TylerOhlsen

+0

例如,在一個我想使用MyService的控制器中,我應該創建一個IMyService並注入它嗎? –