2014-10-31 11 views
6

Giá trị mặc định WEP ứng dụng trong VS 2013 với "User Accounts cá nhân" đi kèm với một bộ điều khiển tài khoản với đoạn mã sau:ASP.NET MVC danh tính thực hiện Mặc định

public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager) 
    { 
     UserManager = userManager; 
     SignInManager = signInManager; 
    } 

    private ApplicationUserManager _userManager; 

    public ApplicationUserManager UserManager 
    { 
     get 
     { 
      return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
     } 
     private set 
     { 
      _userManager = value; 
     } 
    } 

và dòng này trong Startup.Auth.cs

app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 

Tôi muốn hiểu cơ chế nào chuyển tham số userManager tới hàm tạo. Tôi tin rằng mô hình tiêm phụ thuộc được sử dụng ở đây. Nếu tôi chính xác, ở đâu trong giải pháp Visual Studio tôi có thể tìm thấy mã chịu trách nhiệm về việc tiêm phụ thuộc?

Tiếp theo cho phần UserManager, tại sao chúng ta nên kiểm tra nếu _userManager là null nếu nó được thiết lập trong bộ điều khiển?

Trả lời

8

Bạn đã tìm thấy mã chịu trách nhiệm thực hiện việc tiêm phụ thuộc. app.CreatePerOwinContext() là mã để đăng ký usermanager (một đại biểu để tạo ra các usermanager) trong đường ống Owin, mà thực sự chỉ là một từ điển được lưu trong HttpContext.

Bạn có thể đọc chi tiết cách cơ chế này hoạt động trong blogpost này.

Về câu hỏi khác của bạn mà tôi hoàn toàn hiểu! Tại sao kiểm tra null nếu phụ thuộc được tiêm ...? Vâng: Đó là bởi vì Owin được sử dụng ở đây như một cơ chế DI của người nghèo và những gì bạn thấy trong mẫu dự án mặc định thực sự là một cơ chế dự phòng với một mùi của service locator anti pattern. Bởi vì Owin được sử dụng thay vì một container DI khá, ống dẫn MVC cần một constructor mặc định, và do đó kiểm tra null và định vị dịch vụ là cần thiết. Làm thế nào MVC quyết định constructor để sử dụng là không rõ ràng với tôi. Nhưng tôi phát hiện ra rằng người sở hữu trí tuệ đôi khi bị tiêm và sẽ không có trong kịch bản khác. Có lẽ vì ngữ cảnh nợ hầu như chỉ có sẵn sau khi tạo bộ điều khiển Tài khoản.

Trong khi mẫu hoạt động ngoài hộp, nó thực sự di chuyển lông mày của tôi, giống như khi nó di chuyển của bạn. Vì vậy, tôi đã đi với một thực hiện sạch sẽ của một container DI phong nha và có loại bỏ hầu hết các công cụ định vị dịch vụ owin.

Nếu bạn quan tâm, bạn có thể tìm thấy giải pháp của tôi here nơi tôi đã sử dụng Simple Injector. Và có các giải pháp cho các thùng chứa DI khác here

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