2009-11-04 54 views
9

Tôi đang tạo một ứng dụng C# nhỏ, hiện đang bao gồm một hội đồng cốt lõi và một hội đồng winforms. Tôi nhận ra tôi có lẽ không thực sự cần Ninject trong một điều nhỏ như thế này, nhưng tôi muốn thử nó.C#, Ninject: Bạn đặt hạt nhân và mô-đun của bạn ở đâu?

Dù sao, để làm việc với Ninject tôi đã hiểu rằng bạn sẽ viết một tập hợp các mô-đun, bản đồ lớp này được trả về và cứ tiếp tục như vậy. Sau đó bạn sẽ tạo một thể hiện của IKernel và tải các mô-đun của bạn vào đó.

Nhưng, tôi giữ các mô-đun đó ở đâu? Và tôi giữ hạt nhân ở đâu? Đi đâu?

Trả lời

3

Bạn có thể tạo lớp trình bao bọc tĩnh cho hạt nhân. Bằng cách đó bạn có thể làm một cái gì đó như ServiceLocator.Resolve()

Đối với dịch vụ đăng ký có hai cách: đăng ký nội tuyến và mô-đun. Cả hai người trong số họ nên được nạp lúc bootstrapping. Mô-đun tốt hơn để tổ chức.

Có thể bắt đầu với StructureMap dễ dàng hơn vì có lớp tĩnh và có tính năng ánh xạ tự động.

Những Screencasts sẽ giúp bạn bắt đầu:

3

+ đã +1 câu trả lời Marek - chắc chắn xem xét thông qua những nguồn lực.

Một số điểm ...

Bạn chắc chắn có quyền thử điều này, ngay cả trong một ứng dụng nhỏ. Nó cũng quan trọng để suy nghĩ khó khăn về câu hỏi đơn giản bề ngoài như một trong những bạn đặt ra. Đối với DI, bạn thực sự phải thực sự làm một số việc với nó để thực sự đánh giá cao nó - Tôi cho một người ở trong "Oh, tôi chỉ có một ứng dụng nhỏ" (từ chối) trại trong một thời gian dài cho đến khi tôi thực sự sử dụng nó .

Có trường học mặc dù nói chung cần được chỉ đạo cách xa Service Locator và chỉ cần tiêm [mà không cần bất kỳ phụ thuộc nào vào thùng chứa].

Nếu bạn không sử dụng Bộ định vị dịch vụ, không ai cần biết vị trí của Vùng chứa (Hạt nhân), đó là điều tốt nhất.

Mô-đun chủ yếu cho các mục đích của các lô chứa các thứ cần đăng ký trong một Vùng chứa tổng thể cụ thể (Kernel).

Chắc chắn có một triển khai Singleton 'Container toàn cầu' chuẩn trên mạng cho Ninject? EDIT: Chỉ cần tìm thấy một: - http://www.codethinked.com/creating-a-binding-factory-for-ninject

Xem thêm Ninject: How do I inject into a class library?

+0

Tôi chỉ đang tìm kiếm một cách kinh điển để làm điều này và nghĩ "tuyệt vời!" khi tôi thấy bạn liên kết một. Tin xấu, mã đó là TẤT CẢ UNTHREADSAFE. Nếu tôi nên bọc hạt nhân trong một singleton tôi có thể làm điều đó bản thân mình một cách an toàn (gợi ý, constructor tĩnh) nhưng được cảnh báo tất cả những người đến đây trong tương lai: Bài viết liên kết là một thực hiện hoàn toàn không-thread-an toàn. –

+0

@JimmyHoffa Tôi đồng ý không an toàn (đề xuất áp dụng cách tiếp cận bạn chọn từ http://csharpindepth.com/articles/general/singleton.aspx). Tuy nhiên tốt hơn nhiều so với đó là để đi với điểm chính của phản ứng của tôi, đó là để có một gốc thành phần trong đó có một nơi rõ ràng nơi khởi tạo có thể diễn ra để có sự cần thiết cho chủ đề an toàn (trong số các vấn đề khác) ra khỏi hình ảnh hoàn toàn. –

+0

Tôi không quen thuộc với bố cục gốc của bạn, nhưng không có quyền truy cập vào hạt nhân, làm cách nào để bạn yêu cầu các đối tượng mà bạn muốn hàm tạo được tiêm? trong giao diện người dùng của bạn, bạn muốn truy cập vào 'UserManager' có' IUserRepository' lúc xây dựng; làm thế nào để bạn nhận được rằng 'UserManager' mà không truy cập vào hạt nhân (thông qua một cái gì đó giống như một định vị dịch vụ)? Bạn không thể chỉ 'mới UserManager (???);' và mong đợi điều phải được trao cho nó constructor có thể bạn? –

0

Quan điểm của tôi: như Marek cho biết, bạn nên tạo một số (có thể là tĩnh) wrapper cho Kernel, trong đó có trường hợp IKernel. Nó phải chứa phương thức Resolve < T> và có lẽ phương thức Load (INinjectModule module) - tất cả đều tĩnh.

Trong mỗi hội đồng, bạn có thể chỉ cần xác định INinjectModule của riêng bạn để ánh xạ các lớp bên trong hội đồng này.

Trình bao bọc hạt nhân ở mức 'thấp nhất', cụm phổ biến nhất (thường là nơi lắp đặt nhật ký và Utils). Đó là bởi vì Kernel có thể truy cập được từ tất cả các phần - vì vậy nó phải nằm trong assembly, được tham chiếu bởi tất cả các phần khác. Nếu bạn không có, bạn luôn đủ tự do để tạo một tài khoản. Điều này có vẻ hơi phức tạp một chút, người ta có thể mong đợi rằng hạt nhân sẽ ở trong hội đồng 'cao nhất' (tập hợp thực thi). Không đúng.

Để đăng ký tất cả các mô-đun của bạn từ các hội đồng của bạn, chỉ cần gọi Kernel.Load (mới XXModule) trong mỗi người trong số họ.

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