現在、MVC 4 で Web アプリケーションを作成しています。一般的なリポジトリ パターンを使用しています。それはうまくいきます。だから私は次のようなものを持っています、
public class AddressRepository : IAddressRepository
{
private AISDbContext context = new AISDbContext();
public IQueryable<Address> GetAddresses()
{
return context.Address;
}
}
しかし、データをさらにフィルタリングする何かを追加する必要があります。ログインしたユーザーの役割に基づいて、このデータをさらにフィルタリングする必要があります。
このようなもの..
public IQueryable<Address> GetAddresses()
{
return context.Address.where(x=>x.haspermissions = CURENTUSER.Role);
}
これで、いつでもこのような別の関数を追加できますが、一般的なものを試してみたいと思います. コードの最初のビットを使用して、セキュリティ トリミングを適用するだけの別のクラスから継承できるかどうかを知りたいです。この方法では、すべてのクエリを書き直す必要はありません。各クラスにセキュリティ トリマーから継承するように指示するだけです。それが理にかなっていることを願っています..
ありがとう
更新されたコード
public class AddressRepository : SecureRepositoryBase<Address>, IAddressRepository
{
private AISDbContext context = new AISDbContext();
public IQueryable<Address> GetAll()
{
return base.RetrieveSecure(context.Address, 1);
}
}
public abstract class SecureRepositoryBase<T> where T : ISecuredEntity
{
public IQueryable<T> RetrieveSecure(IQueryable<T> entities, int currentUser)
{
return entities.Where(e => e.InspectorId == currentUser);
}
}
public interface ISecuredEntity
{
int? InspectorId { get; set; }
}
public class Address: ISecuredEntity
{
public int COESNo { get; set; }
public int Postcode { get; set; }
public int AuditAuthNo { get; set; }
public bool? SelectedForAudit { get; set; }
public int? RECId { get; set; }
public string CustomerName { get; set; }
public string CustomerAddress { get; set; }
public int? CustomerSuburbId { get; set; }
public int? InspectorId { get; set; }
public DateTime? AuditDate { get; set; }
public int? AuditType { get; set; }
public int? UploadType { get; set; }
public string COESImage { get; set; }
public DateTime CreatedDate { get; set; }
public int? CreatedBy { get; set; }
public DateTime? ModifiedDate { get; set; }
public int? ModifiedBy { get; set; }
public virtual UserDetails Inspector { get; set; }
public virtual Postcodes CustomerSuburb { get; set; }
public virtual ResponsiblePerson RPerson { get; set; }
public virtual UserProfile CreatedByUser { get; set; }
public virtual UserProfile ModifiedByUser { get; set; }
}