Инстанцирование контекста в LINQ к Объектам

Я закончил тем, что нашел решение для своего варианта использования, не полагаясь на абсурдную абстракцию или какую-то непонятную часть .NET Framework. Будь это лучшая практика или нет, я не знаю. Но это работает и делает то, что мне нужно, и в конце концов, это то, что каждый действительно хочет.

Мое решение:

Зарегистрируйте ваш синглтон в структуре DI, вставьте зависимость в метод Configure, затем запустите метод обработки в другой поток.

Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    services.AddSingleton<IQueue, Queue>();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IQueue queue)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    Task.Run(() => queue.BeginProcessing());

    app.UseHttpsRedirection();
    app.UseMvc();
}
26
задан Brian Tompsett - 汤莱恩 31 May 2015 в 14:57
поделиться

2 ответа

Создание нового ObjectContext каждый раз включает «некоторые» накладные расходы. По сути, это связано с копированием метаданных из глобального кэша в метаданные, связанные с конкретным ObjectContext.

Эти издержки относительно незначительны, поэтому часто о них не стоит беспокоиться, особенно если учесть дополнительную безопасность, присущую шаблону использования. класс упаковки может быть? Если это живет для долгое время ObjectContext может расти, чтобы держать много сущностей замедляется со временем. Итак, новый ObjectContext каждый раз может быть хорошая идея.

  • Являются ли призывы к методы в вашем классе упаковки синхронизируется? ObjectContext сам класс не является потокобезопасным, так что если Вы используете второй шаблон, который вам нужен чтобы убедиться, что ваш класс упаковки / хранилище является потокобезопасным, если вы ожидайте, что несколько потоков вызовут его.
  • Являются ли методы по существу не связаны? Если это так, вы можете получить неожиданные побочные эффекты, если они разделяют один контекст между методами.
  • В общем, я рекомендую, чтобы, если методы не сохраняли состояние, то есть запускать и забывать новый контекст для каждого метода, вероятно, хорошая идея.

    Если, однако, у вас относительно недолговечная форма с состоянием или что-то в этом роде, возможно, лучше использовать общий контекст.

    ОБНОВЛЕНИЕ: Я нашел время, чтобы собрать более полный ответ

    40
    ответ дан 28 November 2019 в 07:27
    поделиться

    The second option actually does not clean up after itself if that's what you mean. I prefer the using ObjectContext version every time because I don't have to dispose it after. Not sure I got the question right though... Too many hours programming today.

    public class UserManagerRepository : IUserManagerRepository, IDisposable
    {
        private readonly Entities _context = new Entities();
        private bool _disposed;
    
        public User Create(User user, int countryId)
        {
            user.Country = GetCountry(countryId);
            _context.AddToUser(user);
            _context.SaveChanges();
            return user;
        }
    }
    

    Then to use this repository I do something like:

    using(var repository = new UserManagerRepository())
    {
        repository.Create(user);
    }
    
    0
    ответ дан 28 November 2019 в 07:27
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: