0
我是新的存储库模式在ASP MVC 2中,我想弄清楚如何扩展在我的通用存储库类中的操作,并且无法计算出它是如何做的或者在网上找到它的例子。我想要一个通用的存储库和工作单元,可以在大多数情况下使用,但希望在特殊情况下轻松更改某些内容。asp mvc - 通用存储库和工作单元 - 覆盖存储库方法
我有以下的通用仓库接口和库:
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
}
我有一个特定类型的实体,需要额外的工作添加到插入方法。我想做点像:
public partial class MyEntity : RepositoryBase<MyEntity>
{
public override void Insert(MyEntity entity)
{
// do additional work
base.Insert(entity);
}
}
...但我收到一个错误,“部分声明不能指定不同的基类。”
所以我的问题是,我可以在哪里放置重写的插入方法?我是否必须制作一个继承了通用存储库的独立存储库?如果我这样做了,我将如何改变我的工作班级?
谢谢你的任何建议。
为什么你们还在试图发现一个车轮。实体框架上下文已经实现了这两种模式。你还需要什么?这个额外抽象的目的是什么? – Andrei 2014-11-21 22:13:11
只有一个存储库模式,与语言或框架无关,因为它是一个原则(与某个实现无关)。只要您的业务层使用存储库获取/保存业务对象,它就是存储库模式。代码实现是针对每个应用程序的。 – MikeSW 2014-11-22 00:37:32
@AndreiMikhalevich虽然EF实现UoW,但它可能或可能不会实现存储库模式,具体取决于EF对域对象“按原样”使用。作为个人观点,EF永远不应该被视为一个存储库,因为它公开查询破坏存储库目的的细节,并且它只能用于rdbms。 EF是关于抽象sql/tables,Repository是关于抽象**所有持久性** – MikeSW 2014-11-22 00:41:52