项目中有许多存储库

本文关键字:存储 许多 项目 | 更新日期: 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>