publicclass Person : Entity, ISoftDelete { publicvirtualstring Name { get; set; } publicvirtualbool IsDeleted { get; set; } }如上面的Person类,实现了ISoftDelete接口,当我们使用IRepository.Delete方法删除一个Person时,该Person并不真的从数据库删除,仅仅是IsDeleted属性被设置为true。
publicclass MyService { privatereadonly IRepository<Person> _personRepository; publicMyService(IRepository<Person> personRepository) { _personRepository = personRepository; } public List<Person> GetPeople() { return _personRepository.GetAllList(); } }
publicclass Product : IMustHaveTenant { publicvirtualint TenantId { get; set; } publicvirtualstring Name { get; set; } }如果你创建了一个多租户的应用程序(储存所有租户的数据于单一一个数据库中),你肯定不会希望某个租户看到其他租户的资料,此时你可以实现IMustHaveTenant接口。
publicclass Product : IMayHaveTenant { publicvirtualint? TenantId { get; set; } publicvirtualstring Name { get; set; } }
var people1 = _personRepository.GetAllList();
using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.SoftDelete))
{
var people2 = _personRepository.GetAllList();
}
var people3 = _personRepository.GetAllList();
CurrentUnitOfWork.SetFilterParameter("PersonFilter", "personId", 42);
CurrentUnitOfWork.SetFilterParameter(AbpDataFilters.MayHaveTenant, AbpDataFilters.Parameters.TenantId, 42);
首先定义一个接口:
publicinterface IHasPerson { int PersonId { get; set; } }
实现接口:
publicclass Phone : Entity, IHasPerson { [ForeignKey("PersonId")] publicvirtual Person Person { get; set; } publicvirtualint PersonId { get; set; } publicvirtualstring Number { get; set; } }
重写DbContext类中的OnModelCreating 方法(用的EntityFramework.DynamicFilters,参考https://github.com/jcachat/EntityFramework.DynamicFilters):
protectedoverridevoidOnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Filter("PersonFilter", (IHasPerson entity, int personId) => entity.PersonId == personId, 0); }
"PersonFilter" is the unique name of the filter here. Second parameter defines filter interface and personId filter parameter (not needed if filter is not parametric), last parameter is the default value of the personId.
最后,我们要把过滤器注册到ABP的工作单元系统中,以下代码需要写在模块的Preinitialize方法里:
Configuration.UnitOfWork.RegisterFilter("PersonFilter", false);
First parameter is same unique name we defined before. Second parameter indicates whether this filter is enabled or disabled by default. After declaring such a parametric filter, we can use it by supplying it's value on runtime.
using (CurrentUnitOfWork.EnableFilter("PersonFilter")) { CurrentUnitOfWork.SetFilterParameter("PersonFilter", "personId", 42); var phones = _phoneRepository.GetAllList(); //... }