我使用以下Ninject相關的NuGet包在MVC 5的WebAPI應用:通過ToFactory()生成的工廠創建的對象的控制壽命
Ninject.MVC5
Ninject.Extensions.Factory
ninject.extensions.conventions
我有一個簡單的倉庫和相應的工廠類,像這樣:
public interface ITaskRunner
{
void Run();
}
public interface IRepository<T> where T: class
{
T[] GetAll();
}
public interface IRepositoryFactory<T> where T: class
{
IRepository<T> CreateRepository();
}
我已經安裝使用ToFactory()從Ninject.Extensions.Factory的Ninject綁定像這樣:
kernel.Bind<ITaskRunner>().To<TaskRunner>().InSingletonScope();
kernel.Bind(typeof(IRepository<>)).To(typeof(Repository<>)).InRequestScope();
kernel.Bind<IRepositoryFactory<Contact>>().ToFactory();
我現在用的是工廠在下面的類:
public class TaskRunner : ITaskRunner
{
//MyTask is a simple POCO class(not shown for brevity)
IRepositoryFactory<MyTask> repoFactory = null;
IRepository<MyTask> repo = null;
public TaskRunner(IRepositoryFactory<MyTask> repoFactory)
{
this.repoFactory = repoFactory;
repo = repoFactory.CreateRepository();
}
//implementation elided
}
我注意到的調用repoFactory.CreateRepository()始終返回與Ninject生成的工廠(動態代理)相同的實例。
問題:有沒有辦法來改變/控制此行爲,並設置了「一生」,如瞬態,PerThread等爲實例「CreateRepository」回報?
在這種特殊情況下,可能會在多個線程上異步處理任務,並且存儲庫不是線程安全的,因此從「CreateRepository」返回的實例的單例行爲是不可取的。
你有'Ninject.Extensions.ContextPresevation'安裝嗎? – BatteryBackupUnit
不,我沒有安裝 –