Несколько дней назад у меня была эта проблема с потоками ASP.Net. Я хотел иметь одноэлементный объект для каждого веб-запроса. Мне действительно нужно это для моей единицы работы. Я хотел бы создать экземпляр единицы работы для каждого веб-запроса, чтобы карта идентификации была действительной в рамках запроса. Таким образом, я мог бы использовать IoC, чтобы прозрачно вводить свои собственные классы IUnitOfWork в свои классы репозитория, и я мог бы использовать один и тот же экземпляр для запроса, а затем для обновления моих объектов.Singleton Per Call Context (Web Request) в Unity
Поскольку я использую Unity, я ошибочно использовал PerThreadLifeTimeManager. Вскоре я понял, что модель потоковой передачи ASP.Net не поддерживает то, что я хочу добиться. В основном это использует theadpool и перерабатывает потоки, и это означает, что я получаю один UnitOfWork в поток! Однако то, что я хотел, было одной единицей работы для каждого веб-запроса.
Немного поискового запроса дал мне this great post. Это было именно то, что я хотел; за исключением части единства, которая была довольно легко достижимой.
Это моя реализация для 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());
надеюсь, что это спасает кого-то немного времени.
Хорошее решение. Если возможно, я рекомендую переименовать это в «CallContextLifetimeManager», поскольку веб-запросы, вероятно, являются лишь одним из потенциальных приложений. –
Правда, я обновил текст и код, чтобы отразить это. Благодарю. –
+1 Очень полезно. – MrDustpan