0

我正在使用 UnitOfWork 和存储库模式。该架构是 MVVM,将 LINQ-to-SQL 类直接作为模型。以下代码片段显示了 Generic Repository、A Sample(City Repository) 和 UnitOfWork 类。

通用存储库:

public abstract class Repository<T> : IRepository<T> where T : class
    {
        protected Table<T> _objectSet;

        #region Constructor

        public Repository(DataContext context)
        {
            _objectSet = context.GetTable<T>();            
        }

        #endregion


        public virtual void Add(T entity)
        {
            _objectSet.InsertOnSubmit(entity);
        }
}

城市仓库:

 public class CityRepository: Repository<City>
 {
        public CityRepository(DataContext context): base(context)
       {
             public override void Add(City entity)
             {
                  //Can't publish event here, because Changes 
                  //aren't still submitted to Database

                  base.Add(entity);
                  //CityAddedEventArgs e = new CityAddedEventArgs(entity);
                  //if (this.CityAdded != null)
                  //this.CityAdded(this, e);

             }
       }
 }

工作单元

public class UnitOfWork : IUnitOfWork
{
        private readonly DataContext _context;

        public UnitOfWork(DataContext context)
        {
            _context = context;
        }

        #region IUnitOfWork Members

        public AddressRepository Addresses
        {
            get
            {
                if (_addresses == null)
                {
                    _addresses = new AddressRepository(_context);
                }
                return _addresses;
            }
        }

        public CityRepository Cities
        {
            get
            {
                if (_cities == null)
                {
                    _cities = new CityRepository(_context);
                }
                return _cities;
            }
        }


        public void Save()
        {
            _context.SubmitChanges();

           //Need to Raise event here if an entity is added, 
           //but don't know which entity is added !
        }

}

现在。我想在将实体添加到数据库时发布一个事件,即在 UnitOfWork.Save() 方法上。例如,如果将 AddressEntity 添加到数据库中,则必须触发 AddressAdded 事件,如果将 CityEntity 添加到数据库中,则必须触发 CityAdded 事件。但是,在 SubmitChanges 之后我怎么知道将哪个实体添加到数据库中?



发布事件的唯一目的是让ViewModel知道一个实体被添加到数据库中,现在它可以添加EntityViewModel到它的ObservableCollection<EntityViewModel>

4

1 回答 1

1

在您的 Save 方法中,您可以首先将添加的元素放在一个列表中,然后在 SubmitChanges() 之后使用该列表。类似的东西(我现在没有 Visual Sutdio,所以它可能无法编译):

    public void Save()
    {
        var inserts = _context.GetChangeSet().Inserts.ToList();

        _context.SubmitChanges();

        foreach(var entityAdded in inserts)
        {
            //raise event
        }
    }
于 2012-11-09T12:36:13.073 回答