EF と単純な作業単位パターンの実装も使用する MVC アプリケーションがあります。これが私のUnitOfWork
見た目です:
public class UnitOfWork : IUnitOfWork
{
[ThreadStatic]
private static UnitOfWork _current;
private MyContext _context;
public static UnitOfWork Current
{
get { return _current; }
}
public UnitOfWork()
{
_current = this;
}
public MyContext GetContext()
{
if(_context == null)
_context = new MyContext();
return _context;
}
public int Commit()
{
return _context == null ? 0 : _context.SaveChanges();
}
public void Dispose()
{
_current = null;
if(_context != null)
_context.Dispose();
}
}
一般的なデータベース操作をカプセル化する汎用リポジトリがあります。
public class GenericRepository<TEntity, TEntityKey> where TEntity : class
{
private MyContext _context;
private MyContext Context
{
get { return _context ?? (_context = UnitOfWork.Current.GetContext()); }
}
public void Add(TEntity newEntity)
{
_context.Set<TEntity>().Add(newEntity);
}
//Other methods...
}
使用方法:
using(var unitOfWork = _unitOfWorkFactory.Create())
{
_repository.Add(newEntity);
unitOfWork.Commit();
}
したがって、問題は、MVC フレームワークがリクエストの処理中にスレッドを内部的に切り替えることが可能かどうかです。現在UnitOfWork
はスレッドの静的であるため、このような切り替えはNullReferenceException
呼び出し時に発生しUnitOfWork.Current
ます (正しくない場合は修正してください)。