Проблема обновления через LINQtoSQL в приложении MVC с использованием StructureMap, Repository Pattern и UoW - PullRequest
1 голос
/ 13 сентября 2010

У меня есть приложение 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?Или есть более фундаментальная проблема с дизайном?

Большое спасибо.

1 Ответ

0 голосов
/ 23 сентября 2010

Как правило, не рекомендуется регистрировать что-либо как синглтон, если оно имеет зависимости. Скорее всего, они держатся за старые экземпляры IUnitOfWork, как вы сказали.

Есть какая-то конкретная причина, по которой ваши репозитории синглтон? Я бы посоветовал сделать их HttpContext, также они будут синхронизированы.

...