项目中有许多存储库
本文关键字:存储 许多 项目 | 更新日期: 2023-09-27 18:26:49
我正在使用ninject控制器工厂通过接口将一些存储库绑定到控制器。。。
public class NinjectControllerFactory : DefaultControllerFactory
{
private IKernel ninjectKernel;
public NinjectControllerFactory()
{
ninjectKernel = new StandardKernel();
AddBindings();
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) {
return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType);
}
private void AddBindings()
{
ninjectKernel.Bind<ISystemDefinition<CentreModel>>().To<CentreRepository>();
ninjectKernel.Bind<ISystemDefinition<ResidentStatusModel>>().To<ResidentStatusRepository>();
// here will be the list of lots of repositories with different models
}
}
想象一下,我需要用不同的数据写大约一百个表单,所以我需要至少有不同的模型。。。(可能使用相同的"IReposotory"),但我仍然需要将模型添加到"AddBindings()"方法中。。。可以吗?(我不确定)。。。将具有不同模型的存储库存储到控制器中的最佳做法是什么?
型号例如:
public class CentreModel : BaseModel {
[Required(ErrorMessage = "*")]
[Display(Name = "Name:")]
public string Name { get; set; }
[Display(Name = "Order:")]
[Required(ErrorMessage = "*")]
public int SortOrder { get; set; }
[Display(Name = "Is active:")]
public bool IsActive { get; set; }
[Required(ErrorMessage = "*")]
[Display(Name = "Associated centre:")]
public int AssociatedCentreId { get; set; }
public IEnumerable<CentreListModel> OldCentres { get; set; }
}
接口示例:
public interface ISystemDefinition<T> where T : class,new()
{
IEnumerable<T> GetList(bool? isActive = null);
IEnumerable<T> GetList(bool? isActive = null, int? OwnerID = null);
T Fetch(int? ID);
void Save(T item);
void Remove(T item);
void Order(List<T> items);
}
存储库示例:
public class CentreRepository : BaseRepository, ISystemDefinition<CentreModel> {
public IEnumerable<CentreModel> GetList(bool? isActive) {
return (from c in entities.Centres
where c.IsActive == isActive || isActive == null
orderby c.SortOrder
select new CentreModel {
ID = c.ID,
Name = c.Name,
IsActive = c.IsActive,
SortOrder = c.SortOrder,
AssociatedCentreId = c.AssociatedCentreID
});
}
public CentreModel Fetch(int? ID) {
return (from c in entities.Centres
where c.ID == ID
orderby c.SortOrder
select new CentreModel {
ID = c.ID,
Name = c.Name,
IsActive = c.IsActive,
SortOrder = c.SortOrder,
AssociatedCentreId = c.AssociatedCentreID
}).FirstOrDefault();
}
public void Save(CentreModel model) {
Centre centre = model.IsNew ? new Centre() : entities.Centres.Where(c => c.ID == model.ID).SingleOrDefault();
centre.Name = model.Name;
centre.SortOrder = model.SortOrder;
centre.IsActive = model.IsActive;
centre.AssociatedCentreID = model.AssociatedCentreId;
if (model.IsNew) entities.Centres.Add(centre);
Save();
}
public void Remove(CentreModel model) {
Centre centre = model.IsNew ? new Centre() : entities.Centres.Where(c => c.ID == model.ID).SingleOrDefault();
entities.Centres.Remove(centre);
Save();
}
public void Order(List<CentreModel> items) {
throw new NotImplementedException();
}
public IEnumerable<CentreModel> GetList(bool? isActive = null, int? OwnerID = null) {
throw new NotImplementedException();
}
}
与其为每个模型创建一个存储库,不如创建一个具体的通用存储库。
编辑
例如,如果您有以下界面:
public interface IRepository<TEntity> : IDisposable where TEntity : class
{
IQueryable<TEntity> GetAll();
IQueryable<TEntity> GetAllIncluding(params Expression<Func<TEntity, object>>[] includeProperties);
TEntity Find(params object[] keys);
void Add(TEntity entity, bool save = true);
void Edit(TEntity entity, bool save = true);
void Delete(bool save = true, params object[] keys);
void Save();
}
您可以有一个单独的具体实现(示例使用EF):
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
private readonly DbContext _context;
public Repository(DbContext context)
{
if (context == null) throw new ArgumentNullException("context");
_context = context;
}
public IQueryable<TEntity> GetAll()
{
return _context.Set<TEntity>();
}
public IQueryable<TEntity> GetAllIncluding(params Expression<Func<TEntity, object>>[] includeProperties)
{
IQueryable<TEntity> queryable = GetAll();
return includeProperties.Aggregate(queryable, (current, includeProperty) => current.Include(includeProperty));
}
public TEntity Find(params object[] keys)
{
return _context.Set<TEntity>().Find(keys);
}
... etc.
}
然后,您可以将开放通用接口绑定到开放通用存储库,如下所示:
Bind(typeof(IRepository<,>)).To(typeof(Repository<,>));
另外,对于我的示例,您需要绑定要注入到存储库构造函数中的上下文:
Bind<DbContext>().To<MyDbContext>();
这样就可以为任何类型的模型正确地实例化存储库,而不必为每个模型都有显式绑定。
因此,使用以下控制器构造函数:
protected readonly IRepository<SomeEntity> _repository;
protected BaseController(IRepository<SomeEntity> _repository)
{
_repository = repository;
}
Ninject将注入一个Repository<SomeEntity>
。