Я пытаюсь настроить проект, использующий шаблон UnitOfWork и Repository.
Теперь я не могу использовать IoC и EF4, поэтому я пытаюсь с Linq и DataContext с небольшим количествомЗависимость :(. Я не скрываю, что меня немного смущает интеграция всех этих концепций. Я заметил, что при отладке кода я обнаружил, что DataContext не видит обновления, сделанные для объекта, но каждый раз, когда он добавляет новыйсущность в базу данных.
Я много читал о, но я не могу найти свою проблему, может быть, это простой шаг. Прежде чем продолжить, вот что у меня есть:
Например, яУ меня есть объект с именем foo ... У меня есть контроллер foo, который в конструкторе создает новый экземпляр fooRepository. В fooRepository я добавляю ссылку на мой UnitOfWork, который оборачивает DataContext ... Это верно? Вот мой код
public class ListaController : Controller
{
IListaRepository _listaRepository;
public ListaController()
: this(new ListaRepository()) {
}
public ListaController(IListaRepository repository)
{
_listaRepository = repository;
}
[HttpPost]
public ActionResult Edit(int id, Lista lista)
{
try
{
this._listaRepository.Save(lista);
return RedirectToAction("Index");
}
catch
{
return View();
}
}
}
public class ListaRepository : LinqRepository<Lista>, IListaRepository
{
protected IUnitOfWork uow
{
get { return base.GetCurrentUnitOfWork<IUnitOfWork>(); }
}
public ListaRepository()
: base()
{
}
public override void Add(Lista lista)
{
this.uow.Context.Listas.InsertOnSubmit(lista);
this.uow.Commit();
}
public override void Save(Lista lista)
{
Add(lista);
}
}
public static class UnitOfWork
{
private const string HTTPCONTEXTKEY = "Domain.HttpContext.Key";
private static IUnitOfWorkFactory _unitOfWorkFactory;
private static readonly Hashtable _threads = new Hashtable();
public static void Commit()
{
IUnitOfWork unitOfWork = GetUnitOfWork();
if (unitOfWork != null)
{
unitOfWork.Commit();
}
}
public static IUnitOfWork Current
{
get
{
IUnitOfWork unitOfWork = GetUnitOfWork();
if (unitOfWork == null)
{
//Qui inserisco dipendenza in quanto non uso un IoC
//_unitOfWorkFactory = ObjectFactory.GetInstance<IUnitOfWorkFactory>();
_unitOfWorkFactory = new LinqUnitOfWorkFactory();
unitOfWork = _unitOfWorkFactory.Create();
SaveUnitOfWork(unitOfWork);
}
return unitOfWork;
}
}
private static IUnitOfWork GetUnitOfWork()
{
if (HttpContext.Current != null)
{
if (HttpContext.Current.Items.Contains(HTTPCONTEXTKEY))
{
return (IUnitOfWork)HttpContext.Current.Items[HTTPCONTEXTKEY];
}
return null;
}
else
{
Thread thread = Thread.CurrentThread;
if (string.IsNullOrEmpty(thread.Name))
{
thread.Name = Guid.NewGuid().ToString();
return null;
}
else
{
lock (_threads.SyncRoot)
{
return (IUnitOfWork)_threads[Thread.CurrentThread.Name];
}
}
}
}
private static void SaveUnitOfWork(IUnitOfWork unitOfWork)
{
if (HttpContext.Current != null)
{
HttpContext.Current.Items[HTTPCONTEXTKEY] = unitOfWork;
}
else
{
lock (_threads.SyncRoot)
{
_threads[Thread.CurrentThread.Name] = unitOfWork;
}
}
}
}
public abstract class LinqRepository<T> : IRepository<T> where T : class
{
protected ManagerEmailDataContext _context = new ManagerEmailDataContext();
protected ManagerEmailDataContext Context
{
get
{
if (_context == null)
{
_context = GetCurrentUnitOfWork<LinqUnitOfWork>().Context;
}
return _context;
}
}
public TUnitOfWork GetCurrentUnitOfWork<TUnitOfWork>() where TUnitOfWork : IUnitOfWork
{
return (TUnitOfWork)UnitOfWork.Current;
}
public abstract IQueryable<T> GetAll();
public abstract void Add(T entity);
public abstract void Save(T entity);
public abstract T Get(int id);
}
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
LinqUnitOfWorkFactory.SetDataContext(() => new ManagerEmailDataContext());
}
public class LinqUnitOfWorkFactory : ManagerEmail.Models.IUnitOfWorkFactory
{
private static Func<ManagerEmailDataContext> _objectContextDelegate;
private static readonly Object _lockObject = new object();
public static void SetDataContext(Func<ManagerEmailDataContext> objectDataContextDelegate)
{
_objectContextDelegate = objectDataContextDelegate;
}
public IUnitOfWork Create()
{
ManagerEmailDataContext context;
lock (_lockObject)
{
context = _objectContextDelegate();
}
return new LinqUnitOfWork(context);
}
}`enter code here`
Буду признателен за любую помощь или предложение!
Извините, если я разместил весь код, но я неделю схожу с ума от этой штуки.