Несколько дней назад у меня была эта проблема с многопоточностью ASP.Net. Я хотел иметь одноэлементный объект для каждого веб-запроса. Мне действительно нужно это для моей единицы работы. Я хотел создать единицу работы для каждого веб-запроса, чтобы идентификационная карта действовала на протяжении всего запроса. Таким образом, я мог бы использовать IoC, чтобы прозрачно внедрить свой собственный IUnitOfWork в мои классы репозитория, и я мог бы использовать тот же экземпляр для запроса, а затем обновления своих сущностей.
Поскольку я использую Unity, я по ошибке использовал PerThreadLifeTimeManager. Вскоре я понял, что модель потоков ASP.Net не поддерживает то, что я хочу достичь. В основном он использует theadpool и перерабатывает потоки, а это значит, что я получаю один UnitOfWork на поток !! Тем не менее, я хотел получить одну единицу работы на каждый веб-запрос.
Немного погугливости дал мне этот великий пост . Это было именно то, что я хотел; за исключением части единства, которую было довольно легко достичь.
Это моя реализация PerCallContextLifeTimeManager для единства:
public class PerCallContextLifeTimeManager : LifetimeManager
{
private const string Key = "SingletonPerCallContext";
public override object GetValue()
{
return CallContext.GetData(Key);
}
public override void SetValue(object newValue)
{
CallContext.SetData(Key, newValue);
}
public override void RemoveValue()
{
}
}
И, конечно, я использую это, чтобы зарегистрировать свою единицу работы с кодом, подобным следующему:
unityContainer
.RegisterType<IUnitOfWork, MyDataContext>(
new PerCallContextLifeTimeManager(),
new InjectionConstructor());
Надеюсь, это сэкономит кому-то немного времени.