C# 使用AutoMapper时将日志添加到目标对象
使用AutoMapper时,是否可以向目标对象添加日志 如果我有两个对象:C# 使用AutoMapper时将日志添加到目标对象,c#,.net,automapper,C#,.net,Automapper,使用AutoMapper时,是否可以向目标对象添加日志 如果我有两个对象: class A { int PropertyOne int PropertyTwo int PropertyThree List<string> Log } class B { int PropertyOne int PropertyTwo } A类 { int属性 int属性tw int属性树 列表日志 } B类 { int属性 int属性tw } 当从
class A
{
int PropertyOne
int PropertyTwo
int PropertyThree
List<string> Log
}
class B
{
int PropertyOne
int PropertyTwo
}
A类
{
int属性
int属性tw
int属性树
列表日志
}
B类
{
int属性
int属性tw
}
当从B映射到A时,我希望为每个更改的属性自动将一个日志条目添加到A.log中
例如,如果在映射操作期间,两个对象上的PropertyOne=3,但a.PropertyTwo=1和B.PropertyTwo=2,我希望在a.log中添加一个日志项-最好是类似“PropertyTwo从1更改为2”之类的内容,而不是自动属性,请使用自定义setter创建一个属性,在其中向日志列表中添加一个项 控制台应用程序示例:
public static class Program
{
public class A
{
private int _PropertyOne;
private int _PropertyTwo;
private int _PropertyThree;
public int PropertyOne
{
get { return _PropertyOne; }
set
{
if (value == _PropertyOne)
return;
Log.Add(string.Format("PropertyOne changing value from {0} to {1}", _PropertyOne, value));
_PropertyOne = value;
}
}
public int PropertyTwo
{
get { return _PropertyTwo; }
set
{
if (value == _PropertyTwo)
return;
Log.Add(string.Format("PropertyOne changing value from {0} to {1}", _PropertyTwo, value));
_PropertyTwo = value;
}
}
public int PropertyThree
{
get { return _PropertyThree; }
set
{
if (value == _PropertyThree)
return;
Log.Add(string.Format("PropertyOne changing value from {0} to {1}", _PropertyThree, value));
_PropertyThree = value;
}
}
public List<string> Log { get; private set; }
public A()
{
Log = new List<string>();
}
}
public class B
{
public int PropertyOne { get; set; }
public int PropertyTwo { get; set; }
}
public static void Main(string[] args)
{
AutoMapper.Mapper.Initialize(cfg =>
{
cfg.CreateMap<A, B>().ReverseMap();
});
var b = new B() {PropertyOne = 1, PropertyTwo = 2};
var a = AutoMapper.Mapper.Map<B, A>(b);
a.Log.ForEach(s => Console.WriteLine(s));
}
}
公共静态类程序
{
公共A类
{
私人物业;
私人物业2;
私人物业(intu property tree);;
公共不动产
{
获取{return\u PropertyOne;}
设置
{
如果(值==_属性)
返回;
添加(string.Format(“PropertyOne将值从{0}更改为{1})”,_PropertyOne,value));
_PropertyOne=价值;
}
}
公共不动产2
{
获取{return\u PropertyTwo;}
设置
{
如果(值==\u属性two)
返回;
Add(string.Format(“PropertyOne将值从{0}更改为{1}”,_PropertyTwo,value));
_PropertyTwo=价值;
}
}
公共int属性树
{
获取{return\u PropertyThree;}
设置
{
如果(值==\u属性树)
返回;
添加(string.Format(“PropertyOne正在将值从{0}更改为{1})”,_PropertyTree,value));
_PropertyTree=价值;
}
}
公共列表日志{get;private set;}
公共A()
{
Log=新列表();
}
}
公共B级
{
公共int属性one{get;set;}
公共int属性two{get;set;}
}
公共静态void Main(字符串[]args)
{
AutoMapper.Mapper.Initialize(cfg=>
{
CreateMap().ReverseMap();
});
var b=new b(){PropertyOne=1,PropertyTwo=2};
var a=AutoMapper.Mapper.Map(b);
a、 Log.ForEach=>Console.WriteLine;
}
}
这将输出:
属性将值从0更改为1
属性将两个值从0更改为2
您可以实现一个与名为IPropertyLogger
的标记接口一起工作的。AutoMapper
可以显式使用它的任何子类型
类型转换器可以使用反射并在调用默认自动映射行为之前执行您请求的类似于diff的操作。这将适用于所有标记的类型,并且您不必专门为案例编码每个对象
您基于反射的diff代码将处理您需要的所有日志记录,使您的对象与实现代码保持一致。难道没有办法让AutoMapper这样做吗?我想把所有的锅炉板代码保留在属性设置器之外,因为我有许多不同的对象,并且只想记录更改,如果由AutoMaper完成的话(并且非常希望避免必须实现“IsLoggingEnabled”标志来控制何时应该启用日志记录或不启用日志记录)。您可以将其添加到映射器中(formember,适用于CreatMap中的所有成员),但它一点也不整洁(AutoMapper不是一个日志实用程序)。您也可以使用PostSharp()来减少样板代码。
AutoMapper
不是一个日志框架。Touche!;-)但是我只想借助它的功能;-)