Linq to SQL ObjectContext в веб-приложении - проблема безопасности потоков - PullRequest
1 голос
/ 01 февраля 2012

Занят работой над существующим веб-приложением и обеспокоены безопасностью потоков объекта ObjectContext, используемого в классе BaseRepository. Код, который вызывает у меня чувство пауков:

   // within base repository
   private SiteDataContext context;

   public SitepDataContext Context
    {
        get
        {
            if (context == null)
                context = new SiteDataContext();
            return context;
        }
    }

    // inherited repository
public class InheritedRepository1 : BaseRepository
{
    public SomeEntity Get()
    {
        var something = Context.SomeEntity.First();
    }
}

 public class InheritedRepository2 : BaseRepository
{
    public SomeOtherEntity Get()
    {
        var something = Context.SomeOtherEntity.First();
    }
}

Насколько я понимаю:

  1. ObjectContext является не поточно-безопасным и в этом случае может использоваться несколькими потоками.
  2. В запросе http должен использоваться один объектный текст. Для отображения страницы создается несколько объектных контекстов из различных репозиториев.
  3. Объектный контекст, кажется, не закрыт, удален в любой точке http-запроса. Это может быть проблемой, если транзакции используются, и транзакции фиксируются из потоков, которые не начали их.

Буду признателен за любые отзывы о эти 3 пункта выше , так как мой опыт в основном основан на NHibernate.

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012

Вы можете реализовать шаблоны Репозиторий и Единица работы .

0 голосов
/ 01 февраля 2012

Учитывая, что IIS использует пул потоков для управления запросами, мое решение состоит в том, чтобы создать один и только один ThreadStatic DataContext для каждого запроса и очистить его после завершения запроса.

public class DataContextManager
{
    [ThreadStatic]
    private static MyDataContext dataContext = null;

    public static MyDataContext GetContext()
    {
        if (dataContext == null)
        {
        dataContext = new MyDataContext();
    }
    return dataContext;
}


public static void Clear()
{
    dataContext = null;
}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...