2015-11-05 8 views
6

środowisku ASP.NET 5 beta-8, mam coś takiego zarejestrowany jako usługa:ASP.NET 5 Injection Deployment - Czy atrybut [FromServices] działa tylko w kontrolerze?

services.AddTransient<IMyClass, MyClass>(); 

Kiedy korzystać z tego atrybutu na właściwości w kontrolerze, myClass zostanie ustawiony na wystąpienie IMyClass.

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

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

Jednak, gdy próbuję użyć go w klasie, które nie dziedziczą Controller, to nie wydaje się, aby ustawić właściwość myClass do instancji IMyClass:

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

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

to jest oczekiwane zachowanie? Jak wstrzyknąć moje zależności w zwykłej klasie?

+0

'[FromServices]' nie jest już obsługiwane we właściwościach. – Keith

Odpowiedz

6

Problemem jest to, gdy dzwonisz new MyService(), system wtrysku zależność ASP.NET 5 jest całkowicie pomijany.

Aby mieć zależności wstrzyknięte do MyService, musimy pozwolić ASP.NET utworzyć instancję dla nas.

Jeśli chcesz używać MyService w kontrolerze, musisz najpierw zarejestrować go w kolekcji usług wraz z IMyClass.

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

W tym przypadku wybrałem użyć konstruktora wtrysku, więc nie popełnia błąd próbując instancję MyService sobie:

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

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

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

Teraz jesteś wolny, aby wprowadzić tę usługę w kontrolerze :

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(); 
    } 
} 

Jeśli chcesz dowiedzieć się więcej o systemie wtryskowym ASP.NET 5 Dependency, zrobiłem wideo i blogu tutaj: http://dotnetliberty.com/index.php/2015/10/15/asp-net-5-mvc6-dependency-injection-in-6-steps/

+2

'[FromServices]' został wycofany z właściwości i nie jest już potrzebny w konstruktorach. Aby wprowadzić 'MyService' do' HomeController' teraz potrzebujesz konstruktora: 'public HomeController (MyService myService)' – Keith

2

Można użyć konstruktora wtrysku dla klas niższych poziomów ...

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

Jak utworzyć instancję klasy MyService bez przechodzenia w IMyClass? –

+0

Kontener DI spełni parametry konstruktora. Kontrolery są tworzone, a ich usługi są tworzone za pomocą atrybutu [FromServices], a następnie wszystkich innych zależności, które są tworzone za pomocą iniekcji konstruktora. Gdzie planowałeś utworzyć instancję MyService? – TylerOhlsen

+0

Na przykład w kontrolerze chcę użyć usługi MyService, czy powinienem dokonać usługi IMyService i ją również podać? –