2011-10-13 67 views
31

Làm cách nào để chèn các phụ thuộc vào global.asax.cs, tức là lớp MvcApplication? Trước đây đã từng sử dụng mẫu Dịch vụ Định vị (chống) để tiêm phụ thuộc, tôi đang cố gắng làm theo lời khuyên thực hành tốt nhất trong ứng dụng MVC mới nhất của tôi bằng cách sử dụng một thùng chứa IOC (đặc biệt là Unity.Mvc3 vì nó đi kèm với việc thực hiện IDependencyResolver ra khỏi hộp) và tiêm constructor.Cách chèn các phụ thuộc vào global.asax.cs

Mọi thứ có vẻ khá thẳng về phía trước, ngoại trừ một vài dấu giật, một trong số đó nằm trong global.asax.cs (cái kia dành cho các thuộc tính tùy chỉnh nhưng có một câu hỏi về SO bao hàm).

Các xử lý sự kiện HttpApplication trong lớp MvcApplication như:

Application_Start() 
Application_EndRequest(object sender, EventArgs e) 
Application_AcquireRequestState(object sender, EventArgs e) 

có thể yêu cầu phụ thuộc bên ngoài, ví dụ một sự phụ thuộc vào một ILogService. Vì vậy, làm thế nào để tôi tiêm chúng mà không cần đến mô hình định vị dịch vụ (chống) của ví dụ.

private static ILogService LogService 
{ 
    get 
    { 
     return DependencyResolver.Current.GetService<ILogService>(); 
    } 
} 

Bất kỳ trợ giúp/lời khuyên nào được đánh giá cao!

+0

Hi, câu hỏi thú vị! Tại sao bạn không thể tiêm phụ thuộc trong global.asax của bạn trong OnApplicationStarted? Nếu ứng dụng không thể bắt đầu bạn sẽ nhận thức được nó là không có gì sẽ làm việc ... –

Trả lời

31

Lớp học trong global.asax.cs của bạn là Composition Root, vì vậy bạn không thể (và không nên) tiêm bất kỳ thứ gì vào đó từ bên ngoài.

Tuy nhiên, chỉ có một thể hiện của lớp MvcApplication, vì vậy nếu bạn cần một dịch vụ trong một trong những phương thức của nó, bạn chỉ có thể tuyên bố nó như là một trường thành viên - ví dụ:

public class MvcApplication : System.Web.HttpApplication 
{ 
    private readonly ILogService log; 

    public MvcApplication() 
    { 
     this.log = new MyLogService(); 
    } 

    protected void Application_Start() 
    { 
     // ... 

     this.log.Log("Application started"); 
    } 
} 
+5

+1 trên blog gốc của thành phần. Công cụ tuyệt vời! –

+1

Cảm ơn bạn đã trả lời nhanh Đánh dấu. Làm thế nào để bạn kiểm tra các phương pháp mặc dù nếu bạn không thể tiêm một ví dụ giả vờ ví dụ: ILogService? – magritte

+4

Tôi không. Root Root là một ví dụ về đối tượng Humble (http://xunitpatterns.com/Humble%20Object.html). Nếu bạn cần gọi logic phức tạp từ nó, bạn có thể ủy quyền cho một lớp khác mà * có thể * được kiểm tra đơn vị. –

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