У меня есть приложение ASP MVC, использующее LINQ to SQL для доступа к данным.Я пытаюсь использовать шаблоны «Репозиторий» и «Единица работы», причем уровень обслуживания потребляет хранилища и единицу работы.У меня возникла проблема при попытке выполнить обновления для определенного репозитория.
Моя архитектура приложения выглядит следующим образом:
Мой класс обслуживания:
public class MyService
{
private IRepositoryA _RepositoryA;
private IRepositoryB _RepositoryB;
private IUnitOfWork _unitOfWork;
public MyService(IRepositoryA ARepositoryA, IRepositoryB ARepositoryB, IUnitOfWork AUnitOfWork)
{
_unitOfWork = AUnitOfWork;
_RepositoryA = ARepositoryA;
_RepositoryB = ARepositoryB;
}
public PerformActionOnObject(Guid AID)
{
MyObject obj = _RepositoryA.GetRecords()
.WithID(AID);
obj.SomeProperty = "Changed to new value";
_RepositoryA.UpdateRecord(obj);
_unitOfWork.Save();
}
}
Интерфейс репозитория:
public interface IRepositoryA
{
IQueryable<MyObject> GetRecords();
UpdateRecord(MyObject obj);
}
Репозиторий Реализация LINQtoSQL:
public class LINQtoSQLRepositoryA : IRepositoryA
{
private MyDataContext _DBContext;
public LINQtoSQLRepositoryA(IUnitOfWork AUnitOfWork)
{
_DBConext = AUnitOfWork as MyDataContext;
}
public IQueryable<MyObject> GetRecords()
{
return from records in _DBContext.MyTable
select new MyObject
{
ID = records.ID,
SomeProperty = records.SomeProperty
}
}
public bool UpdateRecord(MyObject AObj)
{
MyTableRecord record = (from u in _DB.MyTable
where u.ID == AObj.ID
select u).SingleOrDefault();
if (record == null)
{
return false;
}
record.SomeProperty = AObj.SomePropery;
return true;
}
}
Интерфейс единицы работы:
public interface IUnitOfWork
{
void Save();
}
Единица работы, реализованная в расширении контекста данных.
public partial class MyDataContext : DataContext, IUnitOfWork
{
public void Save()
{
SubmitChanges();
}
}
Реестр StructureMap:
public class DataServiceRegistry : Registry
{
public DataServiceRegistry()
{
// Unit of work
For<IUnitOfWork>()
.HttpContextScoped()
.TheDefault.Is.ConstructedBy(() => new MyDataContext());
// RepositoryA
For<IRepositoryA>()
.Singleton()
.Use<LINQtoSQLRepositoryA>();
// RepositoryB
For<IRepositoryB>()
.Singleton()
.Use<LINQtoSQLRepositoryB>();
}
}
Моя проблема в том, что когда я вызываю PerformActionOnObject для моего сервисного объекта, обновление никогда не запускает SQL.Я думаю, что это потому, что текст данных в объекте UnitofWork отличается от того в RepositoryA, где данные изменяются.Поэтому, когда служба вызывает Save () в своем IUnitOfWork, базовый текст данных не имеет обновленных данных, поэтому обновление SQL не запускается.
Что-то я сделал не так в настройках реестра StrutureMap?Или есть более фундаментальная проблема с дизайном?
Большое спасибо.