Использование мьютекса с провайдером NInject для предотвращения многопоточного параллельного доступа
В моих проектах Asp.Net MVC я использую провайдеров NInject для создания экземпляров UnitOfWork. (Я использую Mindscape.LightSpeed)
Вот пример связывания в моем классе NinjectModule:
base.Bind<IUnitOfWork>().ToProvider(UnitOfWorkProvider<UnitOfWork>.CreateInstance(_lightSpeedContext, UnitOfWorkProvider.CreateUnitOfWork)).InRequestScope();
И вот пример того, что я делаю в провайдере для создания экземпляров:
protected override T CreateInstance(IContext context)
{
T unitOfWork = default(T);
unitOfWork = this.CreateUnitOfWork();
if (this.ConnectionStrategy != null)
unitOfWork.ConnectionStrategy = this.ConnectionStrategy;
return unitOfWork;
}
Должно ли быть лучше использовать объект мьютекса, как в примере ниже?
private static readonly Mutex _mutex = new Mutex();
protected override T CreateInstance(IContext context)
{
_mutex.WaitOne();
try
{
T unitOfWork = default(T);
unitOfWork = this.CreateUnitOfWork();
if (this.ConnectionStrategy != null)
unitOfWork.ConnectionStrategy = this.ConnectionStrategy;
return unitOfWork;
}
finally
{
_mutex.ReleaseMutex();
}
}
Я не нашел ни одного примера использования мьютекса с провайдером Ninject в сети, и поэтому я задаю вопрос.
Было бы неплохо объяснить, почему мьютекс хорош или не хорош в контексте Asp.Net MVC.
Большое спасибо.
1 ответ
Почему вы хотите использовать мьютекс, когда вы объявляете IUnitOfWork
в объеме запроса?
Это было бы узким местом для вашего веб-приложения, потому что параллельные запросы будут ждать, пока другой создаст экземпляр IUnitOfWork
, Широко используемая практика заключается в создании одного экземпляра единицы работы или контекста базы данных (соединения) и т. Д. Для каждого веб-запроса (IDisposable
объекты будут расположены в конце запроса). Даже если вы объявите свой компонент InSingletonScope
, Ninject должен позаботиться о проблемах параллелизма.