Нужно ли обертывать все мои вызовы 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
с HierarchicalLifetimeManager
context
будет 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, чтобы избавиться от контекста.
Если вы выполняете 'var client = new dbContext()', Unity не имеет ничего общего с жизненным циклом контекста. –