2017-11-15 6 views
0

ユーザが独自のコンテンツ(編集/削除/リスト)を管理できるようにしたい。私のプロジェクトでは、unitOfworkGenericRepositoriesと私はBaseRepositoyを使って残りのリポジトリを実装しました(重複したコードを避けるため)。私はユーザーリポジトリを実装し、ユーザーを取得して操作を続行するために他のリポジトリで使用する必要があることを知っていますが、BaseLepositoryを実装する方法があるかどうかを知りたいですか? またはリポジトリの操作や重複したコードの作成を避けるための別の方法はありますか?ユーザが自分のコンテンツ(一般的なリポジトリ内)のみを編集/削除できるようにする

namespace ServiceLayer.Repository 
{ 
    public abstract class BaseRepository<T> : IBaseRepository<T> where T : BaseModel 
    { 
     private readonly IDbSet<T> _t; 
     private readonly IUnitOfWork _unitOfWork; 
     private IQueryable<T> _db; 
     protected BaseRepository(IUnitOfWork unitOfWork) 
     { 
      _unitOfWork = unitOfWork; 
      _t = _unitOfWork.Set<T>(); 
      _db = _t; 
     } 
     public virtual (IQueryable<T> List, int? PageId, int? PageCount) GetAll(int? pageId, Expression<Func<T, bool>>[] searchExpression, params Expression<Func<T, object>>[] includeExpressions) 
     { 


      if (includeExpressions != null && includeExpressions.Any()) 
      { 
       foreach (var expression in includeExpressions) 
       { 
        _db = _db.Include(expression); 
       } 
      } 
      if (searchExpression != null && searchExpression.Any()) 
      { 
       foreach (var expression in searchExpression) 
       { 
        _db = _db.Where(expression); 
       } 
      } 

      if (pageId == null) return (_db, null, null); 

      if (pageId <= 0) 
       pageId = 1; 

      int take = 5; 
      int skip = ((int)pageId - 1) * take; 
      int count = _db.Count(); 
      int pageCount = count/take; 



      var list = _db.OrderByDescending(x => x.Id).Skip(skip).Take(take); 
      return (list, (int)pageId, pageCount); 
     } 


     public virtual T Get(long id, params Expression<Func<T, object>>[] includeExpression) 
     { 
      if (includeExpression == null) return _t.Find(id); 

      foreach (var expression in includeExpression) 
      { 
       _db = _db.Include(expression); 
      } 
      return _db.SingleOrDefault(x => x.Id == id); 
     } 

     public virtual List<T> GetIdsArray(long?[] ids, params Expression<Func<T, object>>[] includeExpression) 
     { 
      if (ids == null) return null; 
      if (includeExpression == null) return _t.Where(x => ids.Contains(x.Id)).ToList(); 
      foreach (var expression in includeExpression) 
      { 
       _db = _db.Include(expression); 
      } 
      return _db.Where(x => ids.Contains(x.Id)).ToList(); 
     } 

     public virtual T Update(T obj) 
     { 
      _unitOfWork.MarkAsChanged(obj); 
      _unitOfWork.SaveAllChanges(); 
      return obj; 
     } 

     public virtual T Add(T obj) 
     { 
      _t.Add(obj); 
      _unitOfWork.SaveAllChanges(); 
      return obj; 
     } 

     public virtual int Remove(T obj) 
     { 
      _t.Remove(obj); 
      return _unitOfWork.SaveAllChanges(); 
     } 

     public virtual int RemoveIdsArray(long?[] objs) 
     { 
      if (objs == null || objs.Length <= 0) return -5; 
      var objects = GetIdsArray(objs, null); 
      foreach (var o in objects) 
      { 
       _t.Remove(o); 
      } 
      return _unitOfWork.SaveAllChanges(); 
     } 


     public virtual (string[] fieldName, IEnumerable<string> DisplayAttribute) GetAllNameAndTitleOfDbTable() 
     { 
      var fieldName = typeof(T).GetProperties(BindingFlags.DeclaredOnly | 
                BindingFlags.Public | 
                BindingFlags.Instance) 
       .Select(property => property.Name) 
       .ToArray(); 
      var name = typeof(T).GetProperties(BindingFlags.DeclaredOnly | 
               BindingFlags.Public | 
               BindingFlags.Instance).Select(property => 
       ((DisplayAttribute)property.GetCustomAttributes(typeof(DisplayAttribute), false).FirstOrDefault()) 
       ?.Name).ToArray(); 
      return (fieldName, name); 
     } 
    } 
} 

答えて

1

私はあなたが達成しようとしていることを理解していると思います。私が過去にやった

何かが、その後、私のモデルで実装されたIOwnedEntityインターフェイス

public interface IOwnedEntity 
{ 
    string EntityOwner { get; set; } 
} 

を作成することです。

public string EntityOwner 
{ 
    get { return Owner; } 
    set { Owner = value; } 
} 

次に、あなたのリポジトリにあなたはTが所有しているかどうかを確認してフィルタリングすることができます応じて

private bool EntityIsOwnedByOwner(T entity) 
{ 
    return (entity as IOwnedEntity).EntityOwner == CurrentLoggedOnUserID; 
} 

明らかにこれはすべてあなたの例では機能して取得する仕事のビットを必要としますが、アプローチは健全でなければなりません。

関連する問題