【发布时间】:2015-11-03 03:42:03
【问题描述】:
我在 MVC 5 WebAPI 应用程序中使用以下与 Ninject 相关的 nuget 包:
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();
}
我已经使用 Ninject.Extensions.Factory 中的 ToFactory() 设置了 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 生成的工厂(动态代理)相同的实例。
问题:有没有办法改变/控制这种行为并为“CreateRepository”返回的实例?
在这种特殊情况下,任务可能在多个线程上异步处理,并且存储库不是线程安全的,因此从“CreateRepository”返回的实例的单例行为是不可取的。
【问题讨论】:
-
您是否安装了
Ninject.Extensions.ContextPresevation? -
不,我没有安装那个
标签: ninject ninject.web.mvc ninject-extensions