2016-03-18 2 views
0

Я рефакторинг проекта, который создает несколько DbCOntexts для каждого вызова метода в репозиториях данных. Итак, я хочу иметь один экземпляр DbContext для HTTP-запроса.Как использовать один экземпляр DbContext для каждого запроса с использованием Unity

Я попытался сделать:

container.RegisterType<ApplicationDbContext>(new PerRequestLifetimeManager()); 

и для каждого хранилища:

... 
container.RegisterType<IBusinessRepository, BusinessRepository>(new InjectionConstructor(new ApplicationDbContext())); 
container.RegisterType<ICountryRepository, CountryRepository>(); 
... 

Но это создаст новый экземпляр DbContext() в хранилище, конечно.

Я попытался

container.RegisterType<IBranchCategoryRepository, BranchCategoryRepository>( 
new InjectionConstructor(container.Resolve<ApplicationDbContext>())); 

Но это дает мне:

PerRequestLifetimeManager может быть использован только в контексте запроса HTTP. Возможными причинами этой ошибки являются использование менеджера времени жизни в приложении nonASP.NET или использование его в потоке , не связанного с соответствующим контекстом синхронизации.

Как я могу вставлять один и тот же экземпляр в каждый репозиторий?

ответ

2

Я не знаком с Unity, но я с различными каркасами IoC.

Почему вы пытаетесь установить, что нужно вводить в хранилища?

container.RegisterType<IBusinessRepository, BusinessRepository>(new InjectionConstructor(new ApplicationDbContext())); 

Просто оставить из DbContext здесь, но изменить его на:

container.RegisterType<IBusinessRepository, BusinessRepository>(); 

Потому что ты уже зарегистрировать этот компонент, то он будет автоматически введен в конструкторе в каждом классе, которые имеют зависимость. Ваш класс должен выглядеть следующим образом:

public class BusinessRepository : IBusinessRepository 
{ 
    private ApplicationDbContext _context; 

    public BusinessRepository(ApplicationDbContext context) 
    { 
     this._context = context 
    } 
} 

Это работает в замке Виндзор.

+0

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