2011-11-22 48 views
5

Tôi mới sử dụng Ninject (và DI nói chung).Tạo đối tượng sau khi khởi tạo với ninject

Tôi hiểu thế nào kernel tải mô-đun, và mã tôi đã viết vậy, đến nay có xu hướng có một dòng duy nhất:

myKernel.Get<MyApp>() 

mà xây dựng tất cả mọi thứ tôi cần từ các ràng buộc trong mô-đun của tôi. Nếu có yêu cầu đối với các phiên bản khởi tạo bài mới, chúng được các nhà máy xử lý mà tôi ràng buộc để khởi tạo. Cho đến nay, các nhà máy đã được miễn phí của bất kỳ phụ thuộc ninject, chỉ đơn giản là làm mới lên các đối tượng theo yêu cầu.

Bây giờ tôi đã đạt đến điểm mà tôi cần suy nghĩ về việc tạo đối tượng sau khi khởi tạo và mẫu nhà máy riêng của tôi không còn cắt nữa. Điều này sẽ hỗ trợ một giao diện pub/sub cho các máy khách (remote). Với mỗi kết nối mới đến máy chủ của tôi, tôi muốn tạo các trường hợp IClient mới theo một tập hợp các ràng buộc được xác định trong mô-đun ninject. Điều này có nghĩa là nhà máy tôi chuyển vào lúc khởi tạo phải có hạt nhân riêng của mình (hay là một hạt nhân chính)? Trường hợp sẽ CommonServiceLocator tính năng này. CSL có cần thiết không?

Trước khi tôi đi quá xa xuống tận cùng, tôi nghĩ tốt nhất nên hỏi ở đây về cách những người khác có thể tiếp cận vấn đề này.

Trả lời

5

Tạo một giao diện máy

public interface IClientFactory 
{ 
    IClient CreateClient(); 
} 

Đối với Ninject 2.3, hãy xem https://github.com/ninject/ninject.extensions.factory và để nó được Ninject triển khai bằng cách thêm cấu hình sau.

Bind<IClientFactory>().ToFactory(); 

Để tự mình thực hiện 2.2. Triển khai này là một phần của cấu hình vùng chứa và không phải là một phần của việc triển khai của bạn.

public class ClientFactory: IClientFactory 
{ 
    private IKernel kernel; 
    public ClientFactory(IKernel kernel) 
    { 
     this.kernel = kernel; 
    } 

    public IClient CreateClient() 
    { 
     return this.kernel.Get<IClient>(); 
    } 
} 
+0

Cảm ơn Remo. Vì vậy, nếu tôi hiểu chính xác, trong 2,3 bạn không cần phải lo lắng về việc tạo ra một thực hiện cụ thể của giao diện nhà máy? Việc thực hiện thực tế được phát ra bằng cách nào đó bởi ninject khi bị ràng buộc bằng cách sử dụng một cuộc gọi 'ToFactory()'? – spender

+0

Có được triển khai tự động bằng proxy động –

+0

Tốt. Cảm ơn bạn đã giúp đỡ. Nó làm sáng tỏ rất nhiều câu hỏi trong đầu tôi. – spender

1

Dường như mẫu sau cho nhà máy có thể đáp ứng yêu cầu của tôi:

Bind<Func<IClient>>().ToMethod(ctx =>() => ctx.Kernel.Get<ClientImpl>()); 

nơi tôi có nhà xây dựng có dạng:

SomeCtor(Func<IClient> clientFactory, blah...) 
Các vấn đề liên quan