2012-01-31 64 views
6

首先,我有一個定義爲public class DatabaseFactory : Disposable, IDatabaseFactory的dbcontext工廠,它只是創建一個上下文(如果尚不存在的話)。如何使用ninject將單個工廠實例注入到多個存儲庫和工作單元?

接下來,我有一個定義爲public class Repository<T> : IRepository<T> where T : class的通用存儲庫,它在構造函數中使用該工廠。我有其他具體的存儲庫,從這個存儲庫繼承。

我還有一個定義爲public class UnitOfWork : IUnitOfWork的工作單元類,它在構造函數中接受工廠並保存工廠內上下文的所有更改(所有存儲庫都應該使用該類)。

在我的控制器中,我將構造函數設置爲public ProjectController(IDatabaseFactory factory, IUnitOfWork unitOfWork, IProjectRepository projectRep, IUserRepository userRep)

基本上,我需要將工廠的相同實例傳遞給工作單元和所有存儲庫。使用ninject,它會爲每個對象創建一個新工廠,而不是將一個實例全部傳遞給它們。有沒有辦法只允許單個實例通過ninject傳遞還是我沒有正確創建我的工廠和/或不正確理解ninject?

以下是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>(); 

回答

10

這是因爲在默認情況下Ninject使用Transient範圍 - 這將創建一個新的實例每一個類型要求的時間。

更多信息:https://github.com/ninject/ninject/wiki/Object-Scopes

應指定取決於類型的特定實例的整個應用程序的實際使用範圍:

例子看起來是這樣的:

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

真的嗎?我試圖在過去一個半小時內尋找答案。這正是我所期待的。我不知道爲什麼很難通過谷歌找到答案。也許我試圖讓它比現在困難得多。再次感謝! – snoluet 2012-01-31 16:28:58

+0

如果你發現我的帖子有用,你可以接受它作爲答案:) – MonkeyCoder 2012-01-31 16:30:53

+0

我會 - 你回答得太快,現在我必須等待4分鐘:)謝謝。快速的問題,如果你有第二個,如果我把工廠作爲單身 - 它會創建一個單一的實例應用程序範圍內,或只在當前的控制器?如果我想爲IssueController的工廠的另一個實例比ProjectController(但它在該特定控制器中的單個實例),將不會爲我照顧這件事? – snoluet 2012-01-31 16:31:54

相關問題