我使用以下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
不,我没有安装 –