Я использую следующие пакеты nuget, связанные с Ninject, в приложении MVC 5 WebAPI:
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 с помощью ToFactory() из Ninject.Extensions.Factory следующим образом:
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.
Вопрос. Есть ли способ изменить/управлять этим поведением и установить время жизни, такое как Transient, PerThread и т. д., для экземпляра, возвращаемого CreateRepository? ?
В этом конкретном случае задачи могут обрабатываться асинхронно в нескольких потоках, а репозиторий не является потокобезопасным, и, следовательно, одноэлементное поведение для экземпляра, возвращаемого из CreateRepository, нежелательно.
Ninject.Extensions.ContextPresevation
? - person BatteryBackupUnit   schedule 03.11.2015