asp mvc - 通用存储库和工作单元 - 覆盖存储库方法

时间:2014-11-21 21:57:27

标签: c# asp.net-mvc repository-pattern unit-of-work

我是ASP MVC 2中的存储库模式的新手,我正试图弄清楚如何在我的通用存储库类中扩展操作,并且无法弄清楚它是如何做到的或在线查找它的示例。我想要一个适用于大多数情况的通用存储库和工作单元,但是对于特殊情况,我想要一些容易改变的东西。

我有以下通用存储库接口和存储库:

public interface IRepository<TEntity> where TEntity : class
{
    List<TEntity> Get();
    TEntity GetByKey(object key);
    void Insert(TEntity entity);
    void Delete(TEntity entity);
    void Save();
}

public class RepositoryBase<TEntity> : IRepository<TEntity> where TEntity : class
{
    private readonly string entity_set_name;
    public readonly string entity_key_name;

    private ObjectContext object_context;
    private ObjectSet<TEntity> object_set;

    public RepositoryBase(ObjectContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        object_context = context;
        object_set = object_context.CreateObjectSet<TEntity>();

        entity_set_name = object_set.EntitySet.Name;
        entity_key_name = object_set.EntitySet.ElementType.KeyMembers.Single().Name;
    }

    public virtual List<TEntity> Get()
    {
        return object_set.ToList();
    }

    public virtual TEntity GetByKey(object key)
    {
        var entityKey = new EntityKey(entity_set_name, entity_key_name, key);
        return (TEntity)object_context.GetObjectByKey(entityKey);
    }

    public virtual void Insert(TEntity entity)
    {
        object_set.AddObject(entity);
    }

    public virtual void Delete(TEntity entity)
    {
        object_set.DeleteObject(entity);
    }

    public virtual void Save()
    {
        object_context.SaveChanges();
    }
}

......以及以下工作单元课程:

public class UnitOfWork : IDisposable
{
    private MyEntities context = null;
    public Dictionary<Type, object> repositories = new Dictionary<Type, object>();

    public UnitOfWork()
    {
        context = new EmployeeAccessFormEntities();
    }

    public IRepository<TEntity> Repository<TEntity>() where TEntity : class
    {
        if (repositories.Keys.Contains(typeof(TEntity)) == true)
        {
            return repositories[typeof(TEntity)] as IRepository<TEntity>;
        }
        IRepository<TEntity> r = new RepositoryBase<TEntity>(context);
        repositories.Add(typeof(TEntity), r);
        return r;
    }

    public virtual void Save()
    {
        context.SaveChanges();
    }

    #region IDisposable Members

    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                context.Dispose();
            }
        }
        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    #endregion
}

我有一种特定类型的实体,需要在insert方法中添加额外的工作。我想做一些像:

public partial class MyEntity : RepositoryBase<MyEntity>
{
    public override void Insert(MyEntity entity)
    {
        // do additional work

        base.Insert(entity);
    }
}

...但我收到一条错误,&#34;部分声明不得指定不同的基类。&#34;

所以我的问题是,我在哪里可以放置重写的Insert方法?我是否必须创建一个继承通用存储库的独立存储库?如果我这样做,我怎么需要改变我的工作单位?

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

我想我会在一段时间后更好地理解这一点,所以我想要关闭它。我没有必要&#34;覆盖&#34;什么,我只需要在我的工作单元(duh)中添加额外的工作,然后调用插入。感谢发人深省的回应。