2016-10-07 2 views
0

Я использую Unity и Entity Framework в приложении Web API 2. Зарегистрировать типы с HierarchicalLifetimeManager.Unity с HierarchicalLifetimeManager. Нужна ли инструкция «Использование» с платформой Entity?

var container = new UnityContainer(); 
container.RegisterType<IService, Service>(new HierarchicalLifetimeManager()); 

мне нужно обернуть все мои DbContext звонков в использовании заявления, как это делать? Это необходимо? Я думал, что Unity будет использовать контекст для меня.

using (var client = new dbContext()) 
{ 
    var result = client.Customers.toList(); 
} 

Или я могу просто использовать DbContext без using заявления?

+1

Если вы выполняете 'var client = new dbContext()', Unity не имеет ничего общего с жизненным циклом контекста. –

ответ

0

Нужно ли обертывать все мои вызовы dbContext в операторе using, например ?

Я бы сказал, что это зависит от того, как вы используете свой контекст. Возьмем такой пример:

public class Service : IService, IDisposable 
{ 
    private DbContext _context; 
    public Service(DbContext context) 
    { 
     _context = context; 
    } 

    public object Get(int id) 
    { 
     return _context.Customers.Find(id); 
    } 

    public object Update(object obj) 
    { 
     // Code for updating 
    } 

    public void Dispose() 
    { 
     _context.Dispose(); 
    } 
} 

Если вы зарегистрируетесь Service с HierarchicalLifetimeManagercontext будет practially никогда быть утилизированы, поскольку ничто не распорядится услугу и, таким образом, никогда не выбрасывайте в context. Однако приведенный выше пример должен отлично работать с TransientLifetimeManager.

От MSDN:

HierarchicalLifetimeManager. Для этого пожизненного менеджера, как для ContainerControlledLifetimeManager, Unity возвращает тот же экземпляр зарегистрированного типа или объект каждый раз, когда вы называете Resolve или метода ResolveAll или когда механизм зависимостей впрыскивают экземпляры в другие классы.

Если вы используете его в каждом методе, то он будет правильно расположен независимо от того, какой lifetimemanager вы используете. Кроме того, потребителю IService не нужно заботиться об утилизации IService.

public class Service : IService 
{ 

    public object Get(int id) 
    { 
     using (var context = new DbContext()) 
     { 
      return context.Customers.Find(id); 
     } 
    } 

    public object Update(object obj) 
    { 
     // Code for updating 
    } 
} 

Кроме того, что произойдет, если ваш Service был Transient, и вводится в качестве менеджера, который ContainerController. Поскольку менеджер никогда не распоряжается, ни одна из служб не является. Менеджер будет хранить один и тот же экземпляр службы на протяжении всего срока службы контейнера. Поэтому I лично предполагают, что вы сохраняете контекст вне контроля контейнера. Он может работать очень хорошо с помощью пожилых людей, если вы убедитесь, что у вас есть цепь распоряжений. Есть несколько сообщений here и на codereview, которые показывают примеры UoW с Unity, чтобы избавиться от контекста.

Смежные вопросы