2015-11-05 15 views
6

Sử dụng asp.net 5 beta-8, tôi có một cái gì đó như thế này đăng ký dưới dạng một dịch vụ:ASP.NET 5 Dependency Injection - Thuộc tính [FromServices] chỉ hoạt động trong bộ điều khiển?

services.AddTransient<IMyClass, MyClass>(); 

Khi tôi sử dụng thuộc tính này trên một tài sản trong một bộ điều khiển, myClass được thiết lập để thể hiện của các IMyClass.

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

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

Tuy nhiên, khi tôi cố gắng sử dụng nó trong một lớp học mà không kế thừa Controller, nó dường như không thiết lập các myClass tài sản cho một thể hiện của IMyClass:

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

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

Đây có phải là hành vi mong đợi? Làm thế nào để tiêm phụ thuộc của tôi trong một lớp học bình thường?

+0

'[FromServices]' không còn được hỗ trợ trên thuộc tính. – Keith

Trả lời

6

Vấn đề là khi bạn gọi new MyService(), các ASP.NET 5 hệ thống dependency injection là hoàn toàn bỏ qua.

Để phụ thuộc được tiêm vào MyService, chúng ta cần để ASP.NET tạo cá thể cho chúng ta.

Nếu bạn muốn sử dụng MyService trong bộ điều khiển, trước tiên bạn có thể phải đăng ký nó với bộ sưu tập dịch vụ cùng với IMyClass.

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

Trong trường hợp này, tôi đã chọn để sử dụng constructor injection vì vậy tôi không mắc sai lầm khi cố gắng để nhanh chóng MyService bản thân mình:

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

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

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

Bây giờ bạn có thể tự do tiêm dịch vụ này vào điều khiển của bạn :

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

Nếu bạn muốn tìm hiểu thêm về hệ thống dependency injection ASP.NET 5, tôi đã thực hiện một đoạn video và bài đăng blog ở đây: http://dotnetliberty.com/index.php/2015/10/15/asp-net-5-mvc6-dependency-injection-in-6-steps/

+2

'[FromServices]' đã không được chấp nhận trên các thuộc tính và không cần thiết trong các nhà thầu nữa. Để tiêm 'MyService' vào' HomeController' bây giờ bạn cần một hàm tạo: 'public HomeController (MyService myService)' – Keith

2

Bạn có thể sử dụng tiêm constructor cho lớp cấp dưới ...

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

Làm cách nào để khởi tạo lớp MyService mà không chuyển qua IMyClass? –

+0

Vùng chứa DI sẽ đáp ứng các tham số của hàm tạo. Các bộ điều khiển được khởi tạo và các dịch vụ của chúng được khởi tạo với thuộc tính [FromServices] và sau đó tất cả các phụ thuộc khác bên dưới được khởi tạo thông qua quá trình xây dựng. Bạn đang lập kế hoạch để khởi tạo MyService ở đâu? – TylerOhlsen

+0

Ví dụ, trong một bộ điều khiển tôi muốn sử dụng MyService, tôi có nên tạo một IMyService và có được tiêm không? –

Các vấn đề liên quan