7

Tôi đã thừa hưởng một số mã có lớp AuthenticationManager với tất cả các phương thức tĩnh.Làm thế nào để bạn cấu trúc lại các lớp tĩnh để sử dụng tiêm phụ thuộc?

Im giới thiệu DI và muốn thêm một constructor mà mất một sự phụ thuộc UserController

UserController _userController; 

public AuthenticationManager(UserController userCont) 
{ 
    _userController = userCont; 
} 

Bây giờ Im nhận được lỗi thời gian biên dịch như là một biến tĩnh không được tham chiếu từ một phương pháp tĩnh. Đề nghị thực hành tốt nhất của bạn là gì để làm việc này với những thay đổi tối thiểu đối với lớp này và mã gọi?

Chúng tôi đang sử dụng SimpleServiceLocator làm vùng chứa IOC.

+0

Sẽ không phải là lúc để nâng cấp lên [Simple Injector] (http://simpleinjector.codeplex.com)? Tôi đã ngừng phát triển Simple Locator Service. – Steven

+0

Cảm ơn lời khuyên - Tôi không biết rằng Simple Injector đã tồn tại! Injector đơn giản có cung cấp thêm chức năng để giải quyết câu hỏi của tôi hay chỉ là một việc tốt để làm? –

+0

Nó không giải quyết câu hỏi của bạn, nhưng Simple Injector nhanh hơn, sạch hơn và có hỗ trợ tốt hơn cho việc thêm phần mở rộng (hầu hết các kịch bản nâng cao được mô tả [ở đây] (http://simpleinjector.codeplex.com/wikipage?title = Advanced-scenario & referringTitle = Tài liệu) không thể thực hiện với SSL). Bạn có thể đọc về những khác biệt cốt lõi SI một SSL [ở đây] (http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=87). – Steven

Trả lời

9

Cũng tùy thuộc vào tần suất sử dụng lớp trong suốt mã. Bạn có thể muốn tạo một giao diện IAuthenticationManager bao gồm các phương thức khớp với các phương thức tĩnh mà bạn muốn thay thế bằng các phương thức mẫu. Sau đó, bạn có thể tạo một lớp AuthenticationManager triển khai giao diện và chấp nhận phụ thuộc UserController thông qua hàm tạo của nó.

Sau đó, bạn sẽ cần phải thay thế tất cả các phương thức gọi tĩnh các phương thức thể hiện. Bạn có thể muốn tiêm một IAuthenticationManager vào các lớp thông qua một hàm tạo hoặc một thuộc tính. Nếu cần, bạn cũng có thể chuyển một số IAuthenticationManager đến các phương thức (tại các trang gọi) làm tham số.

Thật không may thay thế các phương thức tĩnh mất khá nhiều thời gian tái cấu trúc. Nó là giá trị nỗ lực mặc dù. Nó mở ra cánh cửa để kiểm tra đơn vị.

Hãy nhớ rằng bạn luôn có thể cấu trúc lại một phương pháp tại một thời điểm bằng cách trích xuất giao diện cho một trong các phương pháp tĩnh. Làm từng phương pháp một để thực hiện một cách tiếp cận từng bước một cho việc tái cấu trúc của bạn (nói cách khác, mỗi phương thức đều có giao diện riêng của nó).

Tôi khuyên bạn nên xem sách này nếu bạn có thể: Working Effectively With Legacy Code. Cuốn sách tuyệt vời bao gồm tất cả các loại tình huống như thế này.

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