【问题标题】:Problem updating through LINQtoSQL in MVC application using StructureMap, Repository Pattern and UoW使用 StructureMap、存储库模式和 UoW 在 MVC 应用程序中通过 LINQtoSQL 更新问题
【发布时间】:2010-09-13 14:35:18
【问题描述】:

我有一个使用 LINQ to SQL 进行数据访问的 ASP MVC 应用程序。 我正在尝试使用存储库和工作单元模式,服务层使用存储库和工作单元。 我在尝试对特定存储库执行更新时遇到问题。

我的应用架构如下:

我的服务等级:

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 中数据发生更改的数据上下文不同。因此,当服务在其 IUnitOfWork 上调用 Save() 时,底层数据上下文没有任何更新的数据,因此不会触发更新 SQL。

我在 StrutureMap 注册表设置中做错了什么吗?还是设计存在更根本的问题?

非常感谢。

【问题讨论】:

    标签: linq-to-sql model-view-controller structuremap repository-pattern


    【解决方案1】:

    如果某个对象具有作用域依赖项,那么将其注册为单例通常不是一个好主意。正如您所说,他们很可能会保留 IUnitOfWork 的旧实例。

    您的存储库是单例的有什么特别的原因吗?我建议将它们也设置为 HttpContext 范围,这样它们就会同步。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多