This commit is contained in:
Daniel
2019-03-03 23:18:20 +08:00
parent cd81d2593d
commit df43379a65
12 changed files with 257 additions and 3 deletions

View File

@@ -56,8 +56,18 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="FieldAttribute.cs" />
<Compile Include="FunctionAttribute.cs" />
<Compile Include="ILogService.cs" />
<Compile Include="IUserService.cs" />
<Compile Include="LogFilter.cs" />
<Compile Include="LogInterceptor.cs" />
<Compile Include="LogModel.cs" />
<Compile Include="LogService.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="UserModel.cs" />
<Compile Include="UserService.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />

View File

@@ -0,0 +1,9 @@
using System;
namespace AutofacWihtAOP
{
public class FieldAttribute : Attribute
{
public string Name { get; set; }
}
}

View File

@@ -0,0 +1,9 @@
using System;
namespace AutofacWihtAOP
{
public class FunctionAttribute : Attribute
{
public string Name { get; set; }
}
}

View File

@@ -0,0 +1,8 @@
namespace AutofacWihtAOP
{
public interface ILogService
{
LogModel GetLastLog(LogFilter filter);
void AddLog(LogModel model);
}
}

View File

@@ -0,0 +1,7 @@
namespace AutofacWihtAOP
{
public interface IUserService
{
void ModifyUserInfo(UserModel model);
}
}

View File

@@ -0,0 +1,9 @@
namespace AutofacWihtAOP
{
public class LogFilter
{
public string FunctionName { get; set; }
public string FieldName { get; set; }
public string UserCode { get; set; }
}
}

View File

@@ -0,0 +1,114 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using Castle.DynamicProxy;
namespace AutofacWihtAOP
{
public class LogInterceptor : IInterceptor
{
private ILogService _logService;
public LogInterceptor(ILogService logservice)
{
_logService = logservice;
}
public void Intercept(IInvocation invocation)
{
var models = invocation.Arguments.Where(Ext.IsAttributeType<FunctionAttribute>);
var selectMany = models.SelectMany(x=> x.GetType().GetPropertiesBy<FieldAttribute>(),
(model,prop)=> new
{
CurrentValue = prop.GetValue(model),
FieldName = prop.GetAttributeValue((FieldAttribute z) => z.Name),
functionName = model.GetType()
.GetAttributeValue((FunctionAttribute attr) => attr.Name)
});
foreach (var prop in selectMany)
{
var lastLog = _logService.GetLastLog(new LogFilter()
{
FieldName = prop.FieldName,
FunctionName = prop.functionName
});
var logModel = new LogModel()
{
UserCode = "Dnaiel",
FunctionName = prop.functionName,
FieldName = prop.FieldName,
NewValue = prop.CurrentValue?.ToString()
};
if (lastLog != null)
logModel.OldValue = lastLog.NewValue;
else
logModel.OldValue = string.Empty;
_logService.AddLog(logModel);
}
}
}
public static class Ext
{
public static IEnumerable<PropertyInfo> GetPropertiesBy<T>
(this Type type,bool inherit = true)
where T : Attribute
{
if (type == null)
throw new Exception("type can't be null");
return type.GetProperties()
.Where(x => x.GetCustomAttribute<T>(inherit) != null);
}
public static bool IsAttributeType<TAttr>(this object obj)
where TAttr : Attribute
{
return IsAttributeType<TAttr>(obj, true);
}
public static bool IsAttributeType<TAttr>(this object obj,bool inherit)
where TAttr : Attribute
{
return obj.GetType()
.GetCustomAttribute<TAttr>(inherit) != null;
}
public static TRtn GetAttributeValue<TAttr, TRtn>(this PropertyInfo prop,
Func<TAttr,TRtn> selector)
where TAttr : Attribute
{
TRtn result = default(TRtn);
var attr = prop.GetCustomAttribute<TAttr>();
if (selector == null || attr == null)
return result;
return selector(attr);
}
public static TRtn GetAttributeValue<TAttr, TRtn>(this Type prop,
Func<TAttr, TRtn> selector)
where TAttr : Attribute
{
TRtn result = default(TRtn);
var attr = prop.GetCustomAttribute<TAttr>();
if (selector == null || attr == null)
return result;
return selector(attr);
}
}
}

View File

@@ -0,0 +1,19 @@
using System;
namespace AutofacWihtAOP
{
public class LogModel
{
public DateTime CreateDate { get; set; } = DateTime.Now;
public string OldValue { get; set; }
public string NewValue { get; set; }
public string UserCode { get; set; }
public string FunctionName { get; set; }
public string FieldName { get; set; }
}
}

View File

@@ -0,0 +1,23 @@
using System.Collections.Generic;
using System.Linq;
namespace AutofacWihtAOP
{
public class LogService : ILogService
{
List<LogModel> _list = new List<LogModel>();
public LogModel GetLastLog(LogFilter filter)
{
return _list.OrderBy(x => x.CreateDate)
.FirstOrDefault(x=>
x.FieldName == filter.FieldName &&
x.FunctionName == filter.FunctionName );
}
public void AddLog(LogModel model)
{
_list.Add(model);
}
}
}

View File

@@ -11,6 +11,8 @@ using Autofac;
using Autofac.Builder;
using Autofac.Extras.DynamicProxy;
using Castle.DynamicProxy;
using static System.Convert;
namespace AutofacWihtAOP
{
public interface ITimeService
@@ -69,6 +71,7 @@ namespace AutofacWihtAOP
class Program
{
static void Main(string[] args)
{
@@ -76,9 +79,17 @@ namespace AutofacWihtAOP
IPerson person = container.Resolve<IPerson>();
Console.WriteLine(person.SaySomething());
Thread.Sleep(5000);
Console.WriteLine(person.SaySomething());
//Console.WriteLine(person.SaySomething());
//Thread.Sleep(5000);
//Console.WriteLine(person.SaySomething());
IUserService personService = container.Resolve<IUserService>();
personService.ModifyUserInfo(new UserModel()
{
Birthday = DateTime.Now,
Phone = "0911181212"
});
Console.ReadKey();
}
@@ -88,11 +99,20 @@ namespace AutofacWihtAOP
var builder = new ContainerBuilder();
builder.RegisterType<TimeInterceptor>(); //註冊攔截器
builder.RegisterType<LogInterceptor>(); //註冊攔截器
builder.RegisterType<LogService>()
.As<ILogService>();
builder.RegisterType<Person>()
.As<IPerson>()
.EnableInterfaceInterceptors();
builder.RegisterType<UserService>()
.As<IUserService>()
.EnableInterfaceInterceptors();
//註冊時間Service
builder.RegisterType<TimeService>().As<ITimeService>();

View File

@@ -0,0 +1,13 @@
using System;
namespace AutofacWihtAOP
{
[Function(Name = "Login")]
public class UserModel
{
[Field(Name = "Phone")]
public string Phone { get; set; }
[Field(Name = "Birthday")]
public DateTime Birthday { get; set; }
}
}

View File

@@ -0,0 +1,13 @@
using Autofac.Extras.DynamicProxy;
namespace AutofacWihtAOP
{
[Intercept(typeof(LogInterceptor))]
public class UserService:IUserService
{
public void ModifyUserInfo(UserModel model)
{
}
}
}