[英]ASP.NET MVC generic repository implementation and usage
我已经决定在ASP.NET MVC应用程序中开发一个通用存储库,尽管如此,我在实现方面还是有一些问题。 我将在下面尝试描述我的问题。
这是我的通用存储库:
public interface IGenericRepository<T> where T : class
{
IQueryable<T> GetAll();
IQueryable<T> FindBy(Expression<Func<T, bool>> predicate);
void Add(T entity);
void Delete(T entity);
void Edit(T entity);
void Save();
}
public interface IArtistRepository : IGenericRepository<Artist>
{
Artist GetSingle(int fooId);
}
public abstract class GenericRepository<C, T> : IGenericRepository<T> where T : class where C : DbContext, new()
{
public C Context { get; set; } = new C();
public virtual IQueryable<T> GetAll()
{
IQueryable<T> query = Context.Set<T>();
return query;
}
public IQueryable<T> FindBy(System.Linq.Expressions.Expression<Func<T, bool>> predicate)
{
IQueryable<T> query = Context.Set<T>().Where(predicate);
return query;
}
public virtual void Add(T entity)
{
Context.Set<T>().Add(entity);
}
public virtual void Delete(T entity)
{
Context.Set<T>().Remove(entity);
}
public virtual void Edit(T entity)
{
Context.Entry(entity).State = EntityState.Modified;
}
public virtual void Save()
{
Context.SaveChanges();
}
}
具体实现:
public class ArtistRepository :
GenericRepository<MusicContextSqlServer, Artist>, IArtistRepository
{
public Artist GetSingle(int artistId)
{
var query = GetAll().FirstOrDefault(x => x.ArtistId == artistId);
return query;
}
}
现在在构建控制器时,让我们以Artist控制器为例:
这将是构造函数:
public class ArtistsController : Controller
{
private readonly IArtistRepository _artistRepo;
public ArtistsController(IArtistRepository artistRepo)
{
_artistRepo = artistRepo;
}
}
现在,当涉及到获取艺术家时,我可以使用:
public ActionResult Index()
{
var model = _artistRepo.GetAll();
return View(model.ToList());
}
但是我还需要包括ArtistDetails
dbset,通常使用嵌入控制器内部的上下文,我可以这样:
(在这种情况下,db是嵌入在控制器中的普通上下文)
public ActionResult Index()
{
var artist = db.Artist.Include(a => a.ArtistDetails);
return View(artist.ToList());
}
但是在使用存储库之后,我不确定在哪里可以添加此Include()
函数来使其在我的存储库中正常工作。 目前,我可以从存储库中GetAll()
。 与调用SelectList中的db.ArtistDetails
情况相同。
与Create
情况相同,通常我会使用:(在这种情况下,db是嵌入控制器中的普通上下文)
public ActionResult Create()
{
ViewBag.ArtistId = new SelectList(db.ArtistDetails, "ArtistId", "Bio");
return View();
}
public ActionResult Create([Bind(Include = "ArtistId,Name")] Artist artist)
{
if (ModelState.IsValid)
{
db.Artist.Add(artist);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.ArtistId = new SelectList(db.ArtistDetails, "ArtistId", "Bio", artist.ArtistId);
return View(artist);
}
如何使用我使用的存储库转换那些方法。 总结在实现存储库后如何更改这些方法,应该在哪里进行更改以及外观如何,任何人都可以将解决方案作为答案。 谢谢。
由于您继承了公共属性Context
,因此艺术家存储库可以使用它。 我将向Artist repository
介绍另一种方法,如下所示:
public Artist GetSingleWithDetails(int artistId)
{
return = Context.Set<Artist>().Include(a => a.ArtistDetails).FirstOrDefault(x => x.ArtistId == artistId);
}
理想情况Context
应该保护Context
属性,以便其可用于子类,但不可公开使用
编辑 :对于ArtistDetailsRepository到GetAll ArtistDetails
接口:
public interface IArtistDetailsRepository : IGenericRepository<ArtistDetails>
{
}
库:
public class ArtistDetailsRepository :
GenericRepository<MusicContextSqlServer, ArtistDetails>, IArtistDetailsRepository
{
}
创造:
ViewBag.ArtistId = new SelectList(artistDetailRepository.GetAll.ToList(), "ArtistId", "Bio", artist.ArtistId);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.