2012-01-31 14 views
6

Đầu tiên, tôi có một nhà máy dbcontext được định nghĩa public class DatabaseFactory : Disposable, IDatabaseFactory và nó chỉ tạo ra ngữ cảnh nếu một ngữ cảnh chưa tồn tại.Làm thế nào để tiêm một cá thể nhà máy duy nhất vào nhiều kho lưu trữ và đơn vị công việc bằng cách sử dụng ninject?

Tiếp theo, tôi có một kho lưu trữ chung được xác định public class Repository<T> : IRepository<T> where T : class, trong đó có nhà máy trong hàm tạo. Tôi có kho lưu trữ cụ thể khác được thừa kế từ kho này.

Tôi cũng có một đơn vị lớp công việc được xác định public class UnitOfWork : IUnitOfWork, trong đó có nhà máy trong hàm tạo và lưu tất cả thay đổi vào ngữ cảnh bên trong nhà máy (tất cả các kho lưu trữ sẽ sử dụng).

Trong bộ điều khiển của mình, tôi có hàm tạo được đặt là public ProjectController(IDatabaseFactory factory, IUnitOfWork unitOfWork, IProjectRepository projectRep, IUserRepository userRep).

Về cơ bản, tôi cần cùng một phiên bản của nhà máy được chuyển đến đơn vị công việc và tất cả các kho lưu trữ. Với ninject, nó tạo ra một nhà máy mới cho mỗi đối tượng thay vì truyền một cá thể duy nhất cho tất cả chúng. Có cách nào để chỉ cho phép các trường hợp duy nhất được thông qua qua ninject hoặc tôi không tạo ra nhà máy của tôi một cách chính xác và/hoặc không hiểu ninject một cách chính xác?

Dưới đây là các ràng buộc của tôi trong Ninject:

kernel.Bind<IProjectRepository>().To<ProjectRepository>(); 
kernel.Bind<IIssueRepository>().To<IssueRepository>(); 
kernel.Bind<IUserRepository>().To<UserRepository>(); 
kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>(); 
kernel.Bind<IUnitOfWork>().To<UnitOfWork>(); 

Trả lời

10

Điều này xảy ra vì theo mặc định Ninject sử dụng phạm vi Transient - mà tạo ra một trường hợp mới mỗi khi một loại được yêu cầu. Thông tin

thêm:https://github.com/ninject/ninject/wiki/Object-Scopes

Bạn nên xác định phạm vi tùy thuộc vào việc sử dụng thực tế của một trường hợp đặc biệt của một loại trong suốt ứng dụng của bạn:

Ví dụ có thể trông như thế này:

kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>().InSingletonScope(); 
kernel.Bind<IUserRepository>().To<UserRepository>().InRequestScope(); 
+0

Thật sao? Tôi đã thử tìm kiếm câu trả lời đó trong một tiếng rưỡi vừa qua. Đó là chính xác những gì tôi đang tìm kiếm. Tôi không có ý tưởng tại sao nó rất khó để tìm câu trả lời thông qua google. Có lẽ tôi đã cố gắng làm cho nó khó khăn hơn rất nhiều. Cảm ơn một lần nữa! – snoluet

+0

Nếu bạn thấy bài viết của tôi hữu ích bạn có thể chấp nhận nó như một câu trả lời :) – MonkeyCoder

+0

Tôi sẽ - bạn trả lời nó quá nhanh và bây giờ tôi phải đợi 4 phút :) Cảm ơn mặc dù. Câu hỏi nhanh nếu bạn có một giây, nếu tôi đặt nhà máy như singleton - nó sẽ tạo ra một ứng dụng đơn lẻ rộng hay chỉ trong bộ điều khiển hiện tại? Nếu tôi muốn một trường hợp khác nhau của nhà máy cho IssueController hơn ProjectController (nhưng một trường hợp duy nhất của nó trong bộ điều khiển cụ thể), sẽ ninject chăm sóc đó cho tôi? – snoluet

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