Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Filter NHibernate #557

Merged
merged 11 commits into from
Aug 13, 2015
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

ASP.NET Boilerplate
===================

Expand Down
2 changes: 2 additions & 0 deletions src/Abp.NHibernate/Abp.NHibernate.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@
<ItemGroup>
<Compile Include="NHibernate\EntityMappings\NhMappingExtensions.cs" />
<Compile Include="NHibernate\EntityMappings\EntityMapOfTEntity.cs" />
<Compile Include="NHibernate\Filters\MayHaveTenantFilter.cs" />
<Compile Include="NHibernate\Filters\MustHaveTenantFilter.cs" />
<Compile Include="NHibernate\Interceptors\AbpNHibernateInterceptor.cs" />
<Compile Include="NHibernate\ISessionProvider.cs" />
<Compile Include="NHibernate\Repositories\NhRepositoryBaseOfTEntityAndTPrimaryKey.cs" />
Expand Down
4 changes: 4 additions & 0 deletions src/Abp.NHibernate/NHibernate/AbpNHibernateModule.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@
using Abp.Configuration.Startup;
using Abp.Dependency;
using Abp.Modules;
using Abp.NHibernate.Filters;
using Abp.NHibernate.Interceptors;
using Abp.NHibernate.Repositories;
using Castle.Components.DictionaryAdapter.Xml;
using NHibernate;

namespace Abp.NHibernate
Expand All @@ -24,6 +26,8 @@ public override void Initialize()
IocManager.Register<AbpNHibernateInterceptor>(DependencyLifeStyle.Transient);

_sessionFactory = Configuration.Modules.AbpNHibernate().FluentConfiguration
.Mappings(m => m.FluentMappings.Add(typeof(MayHaveTenantFilter)))
.Mappings(m => m.FluentMappings.Add(typeof(MustHaveTenantFilter)))
.ExposeConfiguration(config => config.SetInterceptor(IocManager.Resolve<AbpNHibernateInterceptor>()))
.BuildSessionFactory();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System;
using Abp.Domain.Entities;
using Abp.NHibernate.Filters;
using Abp.Runtime.Session;
using FluentNHibernate.Mapping;

namespace Abp.NHibernate.EntityMappings
Expand Down Expand Up @@ -29,6 +31,13 @@ protected EntityMap(string tableName)
{
Where("IsDeleted = 0"); //TODO: Test with other DBMS then SQL Server
}

if (typeof(IMustHaveTenant).IsAssignableFrom(typeof (TEntity)))
ApplyFilter<MustHaveTenantFilter>();
if (typeof(IMayHaveTenant).IsAssignableFrom(typeof(TEntity)))
ApplyFilter<MayHaveTenantFilter>();


}
}
}
22 changes: 22 additions & 0 deletions src/Abp.NHibernate/NHibernate/Filters/MayHaveTenantFilter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using Abp.Domain.Uow;
using FluentNHibernate.Mapping;
using NHibernate;

namespace Abp.NHibernate.Filters
{
/// <summary>
/// Add filter MayHaveTenant
/// </summary>
public class MayHaveTenantFilter : FilterDefinition
{
/// <summary>
/// Contructor
/// </summary>
public MayHaveTenantFilter()
{
WithName(AbpDataFilters.MayHaveTenant)
.AddParameter("tenantId", NHibernateUtil.Int32)
.WithCondition("TenantId = :tenantId )");
}
}
}
22 changes: 22 additions & 0 deletions src/Abp.NHibernate/NHibernate/Filters/MustHaveTenantFilter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using Abp.Domain.Uow;
using FluentNHibernate.Mapping;
using NHibernate;

namespace Abp.NHibernate.Filters
{
/// <summary>
/// Add filter MustHaveTenant
/// </summary>
public class MustHaveTenantFilter : FilterDefinition
{
/// <summary>
/// Contructor
/// </summary>
public MustHaveTenantFilter()
{
WithName(AbpDataFilters.MustHaveTenant)
.AddParameter("tenantId", NHibernateUtil.Int32)
.WithCondition("TenantId = :tenantId");
}
}
}
55 changes: 55 additions & 0 deletions src/Abp.NHibernate/NHibernate/Uow/NhUnitOfWork.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data;
using System.Threading.Tasks;
using Abp.Dependency;
using Abp.Domain.Entities;
using Abp.Domain.Uow;
using Abp.NHibernate.Filters;
using Abp.Runtime.Session;
using Abp.Transactions.Extensions;
using FluentNHibernate.Cfg;
using NHibernate;

namespace Abp.NHibernate.Uow
Expand All @@ -12,6 +19,10 @@ namespace Abp.NHibernate.Uow
/// </summary>
public class NhUnitOfWork : UnitOfWorkBase, ITransientDependency
{
/// <summary>
/// Used to get current session values.
/// </summary>
public IAbpSession AbpSession { get; set; }
/// <summary>
/// Gets NHibernate session object to perform queries.
/// </summary>
Expand All @@ -32,6 +43,7 @@ public class NhUnitOfWork : UnitOfWorkBase, ITransientDependency
public NhUnitOfWork(ISessionFactory sessionFactory, IUnitOfWorkDefaultOptions defaultOptions)
: base(defaultOptions)
{
AbpSession = NullAbpSession.Instance;
_sessionFactory = sessionFactory;
}

Expand All @@ -41,12 +53,38 @@ protected override void BeginUow()
? _sessionFactory.OpenSession(DbConnection)
: _sessionFactory.OpenSession();



if (Options.IsTransactional == true)
{
_transaction = Options.IsolationLevel.HasValue
? Session.BeginTransaction(Options.IsolationLevel.Value.ToSystemDataIsolationLevel())
: Session.BeginTransaction();
}

this.CheckAndSetMayHaveTenant();
this.CheckAndSetMustHaveTenant();

}

protected virtual void CheckAndSetMustHaveTenant()
{
if (this.IsFilterEnabled(AbpDataFilters.MustHaveTenant)) return;
if (AbpSession.TenantId == null) return;
ApplyEnableFilter(AbpDataFilters.MustHaveTenant); //Enable Filters
ApplyFilterParameterValue(AbpDataFilters.MustHaveTenant,
AbpDataFilters.Parameters.TenantId,
AbpSession.GetTenantId()); //ApplyFilter
}

protected virtual void CheckAndSetMayHaveTenant()
{
if (this.IsFilterEnabled(AbpDataFilters.MayHaveTenant)) return;
if (AbpSession.TenantId == null) return;
ApplyEnableFilter(AbpDataFilters.MayHaveTenant); //Enable Filters
ApplyFilterParameterValue(AbpDataFilters.MayHaveTenant,
AbpDataFilters.Parameters.TenantId,
AbpSession.TenantId); //ApplyFilter
}

public override void SaveChanges()
Expand Down Expand Up @@ -91,5 +129,22 @@ protected override void DisposeUow()

Session.Dispose();
}

protected override void ApplyEnableFilter(string filterName)
{
if( Session.GetEnabledFilter(filterName) == null )
Session.EnableFilter(filterName);
}
protected override void ApplyDisableFilter(string filterName)
{
if ( Session.GetEnabledFilter(filterName) != null )
Session.DisableFilter(filterName);
}

protected override void ApplyFilterParameterValue(string filterName, string parameterName, object value)
{
Session.GetEnabledFilter(filterName)
.SetParameter(parameterName, value);
}
}
}