Browse Source

Introduce IAuditInfoContributor.

pull/395/head
Halil ibrahim Kalkan 8 years ago
parent
commit
abbefbb139
  1. 11
      framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Auditing/HttpContextClientInfoProvider.cs
  2. 1
      framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj
  3. 17
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditInfoContributionContext.cs
  4. 38
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingHelper.cs
  5. 7
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingOptions.cs
  6. 31
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/ClientInfoAuditInfoContributor.cs
  7. 38
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/DefaultAuditInfoProvider.cs
  8. 9
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoContributionContext.cs
  9. 9
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoContributor.cs
  10. 14
      framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoProvider.cs

11
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Auditing/HttpContextClientInfoProvider.cs → framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Auditing/HttpContextClientInfoProvider.cs

@ -1,9 +1,10 @@
using System;
using Castle.Core.Logging;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.Auditing;
namespace Volo.Abp.AspNetCore.Mvc.Auditing
namespace Microsoft.AspNetCore.Auditing
{
public class HttpContextClientInfoProvider : IClientInfoProvider
{
@ -13,7 +14,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Auditing
public string ComputerName => GetComputerName();
public ILogger Logger { get; set; }
public ILogger<HttpContextClientInfoProvider> Logger { get; set; }
private readonly IHttpContextAccessor _httpContextAccessor;
@ -27,7 +28,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Auditing
_httpContextAccessor = httpContextAccessor;
_httpContext = httpContextAccessor.HttpContext;
Logger = NullLogger.Instance;
Logger = NullLogger<HttpContextClientInfoProvider>.Instance;
}
protected virtual string GetBrowserInfo()
@ -45,7 +46,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Auditing
}
catch (Exception ex)
{
Logger.Warn(ex.ToString());
Logger.LogException(ex, LogLevel.Warning);
}
return null;

1
framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj

@ -14,6 +14,7 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.Auditing\Volo.Abp.Auditing.csproj" />
<ProjectReference Include="..\Volo.Abp.Security\Volo.Abp.Security.csproj" />
<ProjectReference Include="..\Volo.Abp.Threading\Volo.Abp.Threading.csproj" />
<ProjectReference Include="..\Volo.Abp.VirtualFileSystem\Volo.Abp.VirtualFileSystem.csproj" />

17
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditInfoContributionContext.cs

@ -0,0 +1,17 @@
using System;
namespace Volo.Abp.Auditing
{
public class AuditInfoContributionContext : IAuditInfoContributionContext
{
public IServiceProvider ServiceProvider { get; }
public AuditInfo AuditInfo { get; set; }
public AuditInfoContributionContext(IServiceProvider serviceProvider, AuditInfo auditInfo)
{
ServiceProvider = serviceProvider;
AuditInfo = auditInfo;
}
}
}

38
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingHelper.cs

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Volo.Abp.DependencyInjection;
@ -19,21 +20,20 @@ namespace Volo.Abp.Auditing
protected ICurrentUser CurrentUser { get; }
protected ICurrentTenant CurrentTenant { get; }
protected IClock Clock { get; }
protected IAuditInfoProvider AuditInfoProvider;
protected AuditingOptions Options;
protected IAuditSerializer AuditSerializer;
protected IServiceProvider ServiceProvider;
public AuditingHelper(
IAuditInfoProvider auditInfoProvider,
IAuditSerializer auditSerializer,
IOptions<AuditingOptions> options,
ICurrentUser currentUser,
ICurrentTenant currentTenant,
IClock clock,
IAuditingStore auditingStore,
ILogger<AuditingHelper> logger)
ILogger<AuditingHelper> logger,
IServiceProvider serviceProvider)
{
AuditInfoProvider = auditInfoProvider;
Options = options.Value;
AuditSerializer = auditSerializer;
CurrentUser = currentUser;
@ -42,6 +42,7 @@ namespace Volo.Abp.Auditing
AuditingStore = auditingStore;
Logger = logger;
ServiceProvider = serviceProvider;
}
public virtual bool ShouldSaveAudit(MethodInfo methodInfo, bool defaultValue = false)
@ -109,18 +110,31 @@ namespace Volo.Abp.Auditing
ExecutionTime = Clock.Now
};
try
{
AuditInfoProvider.Fill(auditInfo);
}
catch (Exception ex)
{
Logger.LogException(ex, LogLevel.Warning);
}
ExecuteContributors(auditInfo);
return auditInfo;
}
protected virtual void ExecuteContributors(AuditInfo auditInfo)
{
using (var scope = ServiceProvider.CreateScope())
{
var context = new AuditInfoContributionContext(scope.ServiceProvider, auditInfo);
foreach (var contributor in Options.Contributors)
{
try
{
contributor.Contribute(context);
}
catch (Exception ex)
{
Logger.LogException(ex, LogLevel.Warning);
}
}
}
}
public virtual void Save(AuditInfo auditInfo)
{
AuditingStore.Save(auditInfo);

7
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingOptions.cs

@ -11,6 +11,8 @@ namespace Volo.Abp.Auditing
public bool IsEnabledForAnonymousUsers { get; set; }
public List<IAuditInfoContributor> Contributors { get; }
public List<Type> IgnoredTypes { get; }
public AuditingOptions()
@ -18,6 +20,11 @@ namespace Volo.Abp.Auditing
IsEnabled = true;
IsEnabledForAnonymousUsers = true;
Contributors = new List<IAuditInfoContributor>
{
new ClientInfoAuditInfoContributor()
};
IgnoredTypes = new List<Type>
{
typeof(Stream),

31
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/ClientInfoAuditInfoContributor.cs

@ -0,0 +1,31 @@
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
namespace Volo.Abp.Auditing
{
public class ClientInfoAuditInfoContributor : IAuditInfoContributor
{
public Task Contribute(IAuditInfoContributionContext context)
{
var clientInfoProvider = context.ServiceProvider.GetRequiredService<IClientInfoProvider>();
if (context.AuditInfo.ClientIpAddress.IsNullOrEmpty())
{
context.AuditInfo.ClientIpAddress = clientInfoProvider.ClientIpAddress;
}
if (context.AuditInfo.BrowserInfo.IsNullOrEmpty())
{
context.AuditInfo.BrowserInfo = clientInfoProvider.BrowserInfo;
}
if (context.AuditInfo.ClientName.IsNullOrEmpty())
{
context.AuditInfo.ClientName = clientInfoProvider.ComputerName;
}
return Task.CompletedTask;
}
}
}

38
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/DefaultAuditInfoProvider.cs

@ -1,38 +0,0 @@
using System;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Auditing
{
//TODO: Implement as multiple providers can contribute!
/// <summary>
/// Default implementation of <see cref="IAuditInfoProvider" />.
/// </summary>
public class DefaultAuditInfoProvider : IAuditInfoProvider, ITransientDependency
{
protected IClientInfoProvider ClientInfoProvider { get; }
public DefaultAuditInfoProvider(IClientInfoProvider clientInfoProvider)
{
ClientInfoProvider = clientInfoProvider;
}
public virtual void Fill(AuditInfo auditInfo)
{
if (auditInfo.ClientIpAddress.IsNullOrEmpty())
{
auditInfo.ClientIpAddress = ClientInfoProvider.ClientIpAddress;
}
if (auditInfo.BrowserInfo.IsNullOrEmpty())
{
auditInfo.BrowserInfo = ClientInfoProvider.BrowserInfo;
}
if (auditInfo.ClientName.IsNullOrEmpty())
{
auditInfo.ClientName = ClientInfoProvider.ComputerName;
}
}
}
}

9
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoContributionContext.cs

@ -0,0 +1,9 @@
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Auditing
{
public interface IAuditInfoContributionContext : IServiceProviderAccessor
{
AuditInfo AuditInfo { get; set; }
}
}

9
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoContributor.cs

@ -0,0 +1,9 @@
using System.Threading.Tasks;
namespace Volo.Abp.Auditing
{
public interface IAuditInfoContributor
{
Task Contribute(IAuditInfoContributionContext context);
}
}

14
framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoProvider.cs

@ -1,14 +0,0 @@
namespace Volo.Abp.Auditing
{
/// <summary>
/// Provides an interface to provide audit informations in the upper layers.
/// </summary>
public interface IAuditInfoProvider
{
/// <summary>
/// Called to fill needed properties.
/// </summary>
/// <param name="auditInfo">Audit info that is partially filled</param>
void Fill(AuditInfo auditInfo);
}
}
Loading…
Cancel
Save