2015-10-27 3 views
0

у меня есть класс UnitOfWork и хранилище, которое использует его что-то вдоль линий этого:UnitOfWork, хранилища и утилизация соединений

единицы работы

private SqlConnection _conn; 
private TransactionScope _ts; 

public UnitOfWork(SqlConnection conn, TransactionScope ts) 
{ 
    _ts = ts; 
    _conn = conn; 
    _conn.EnlistTransaction(Transaction.Current); 
} 

public SqlConnection Connection 
{ 
    get { return _conn; } 
} 

public void Save() 
{ 
    _ts.Complete(); 
} 

#region IDisposable 

public void Dispose() 
{ 
    if (_conn != null) 
    { 
     _conn.Dispose(); 
     _conn = null; 
    } 

    if (_ts != null) 
    { 
     _ts.Dispose(); 
     _conn = null; 
    } 
} 

хранилище

SqlConnection _conn; 

public Repository(IUnitOfWork uow) 
{ 
    _conn = uow.Connection; 
} 
// some methods 
public void Dispose() 
{ 
    if (_conn != null) 
    { 
     _conn.Dispose(); 
     _conn = null; 
    } 
} 

Я использую его вот так

using (var uow = new UnitOfWork()) 
{ 
    using (var repo = new Repository(uow)) 
    { 
     if (repo.UpdateStuff()) 
     { 
      uow.Save(); 
     } 
    } 
} 

метод dispose сначала вызывается в репо, который устанавливает и завершает соединение. Но потом, когда мы доберемся до UOW отчуждать, соединение больше не утратившее расположено «снова» Я уверен, что является тупым, но может кто-нибудь объяснить, пожалуйста,

благодаря

ответ

1

Правой часть заявление

_conn = uow.Connection; 

фактически возвращает копию ссылки на объект, а не ссылку.

Так что вы устанавливаете значение null в методе репозитория Dispose - это локальная ссылка на соединение, которая отличается от ссылки на соединение в экземпляре UnitOfWork.

Если вы действительно хотите сохранить это поведение (при условии, что свойство UnitOfWork Connection установлено равным null кодом кода репозитория), вы должны установить uow.Connection равным null, а не локальной ссылкой _conn.

+0

поэтому я просто не должен делать repo idisposable и оставлять это для утилизации UOW. я сделал это так, чтобы я мог написать это: using (var repo = новый репозиторий (новый UnitOfWork())) {} – nat

+0

Вопрос: «Репозиторий должен распоряжаться и освобождать соединение UoW?». Для меня это скорее работа UoW. – tumasgiu

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

  • Нет связанных вопросов^_^