數據過濾器(Data filters)
在數據庫開發中,我們一般會運用軟刪除(soft-delete)模式,即不直接從數據庫刪除數據,而是標記這筆數據為已刪除。因此,如果實體被軟刪除了,那么它就應該不會在應用程序中被檢索到。要達到這種效果,我們需要在每次檢索實體的查詢語句上添加SQL的Where條件IsDeleted = false。這是個乏味的工作,但它是個容易被忘掉的事情。因此,我們應該要有個自動的機制來處理這些問題。
ABP提供數據過濾器(Data filters),它使用自動化的,基于規則的過濾查詢。ABP已經有一些預定義的過濾器,當然也可以自行創建你專屬的過濾器。
注意:只針對EntityFramework:ABP數據過濾器僅實現在EntityFramework。還無法在其它ORM工具中使用。見其它ORM章節于本文末端。
預定義過濾器
1.軟刪除接口(ISoftDelete)
軟刪除過濾器(Soft-delete filter )會過濾從數據庫查詢出來的實體且是自動套用(從結果集中提取出來)。如果實體需要被軟刪除,它需要實現ISoftDelete接口,該接口僅定義了一個IsDeleted屬性。例:
public class Person : Entity, ISoftDelete { public virtual string Name { get; set; } public virtual bool IsDeleted { get; set; } }Person實體實際上并沒有從數據庫中被刪除,當刪除此實體時,IsDeleted屬性值會被設定為true。當你使用IRepository.Delete方法時,ABP會自動完成這些工作(你可以手動設定IsDeleted為true,但是Delete方法更加自然且是較建議的方式)。
當實現了ISoftDelete之后,當你已經從數據庫中取得了People列表,已被刪除的People實體并不會被檢索到。在這里有一個示例類,該類使用了person倉儲來取得所有的People實體:
public class MyService { private readonly IRepository<Person> _personRepository; public MyService(IRepository<Person> personRepository) { _personRepository = personRepository; } public List<Person> GetPeople() { return _personRepository.GetAllList(); } }GetPeople方法僅取得Person實體,該實體其IsDeleted = false(非刪除狀態)。所有的倉儲方法以及導航屬性都能夠正常運作。我們可以添加一些其它的Where條件,Join...等等。它將會自動地添加IsDeleted=false條件到生成的SQL查詢語句中。
注意:何時啟用?ISoftDelete過濾器總是啟用,除非你直接禁用它。
提醒:如果你實現了IDeletionAudited接口(該接口繼承自ISoftDelete),刪除創建時間和被刪除的用戶Id,這些都會由ABP進行自動的處理。
2.多租接口(IMustHaveTenant)
如果你創建一個多租戶的應用程序(儲存所有租戶的數據于單一一個數據庫中),你肯定不會希望某個租戶看到其它租戶的資料。你可以實現IMustHaveTenant接口于此案例中,示例如下:
新聞熱點
疑難解答
圖片精選