有时我可以让 AutoMapper return 同一个对象吗?
Can I get AutoMapper to return the same object sometimes?
我一直在使用 AutoMapper 在接口和该接口的具体实现之间进行映射。我假设如果我传递给 AutoMapper 的 Map<TDestination>
方法的类型与 return 类型相同,那么原始对象将被 returned(作为一种短路手术)。我的假设是错误的:事实上,在查看之后我注意到该方法的文档明确指出:
Execute a mapping from the source object to a new destination object. The source type is inferred from the source object. (bold emphasis mine)
我打开这个快速控制台应用程序只是为了验证:
using System;
using AutoMapper;
namespace ConsoleApplication
{
class Program
{
interface IFoo
{
string Bar { get; }
}
class Foo : IFoo
{
public string Bar { get; set; }
}
static void Main(string[] args)
{
Mapper.CreateMap<IFoo, Foo>();
IFoo a = new Foo { Bar = "baz" };
Foo b = Mapper.Map<Foo>(a);
Console.WriteLine(Object.ReferenceEquals(a, b)); // false
}
}
}
现在我知道了这种行为,我可以针对我的特定用例围绕它进行优化,但我想知道是否有使用 AutoMapper 的替代方法,它将 "short-circuit" 以上述方式(即,如果类型与我想要的目标类型相同,则返回原始对象)?
您可以使用 Mapper.Map<TSource,TDestination>(source, destination)
重载。
Foo b = new Foo();
Mapper.Map<IFoo,Foo>(a,b);
AutoMapper 将使用 b 而不是构建新对象。总体而言,您可以在 Mapper.Map 周围使用包装器,这种替代方法可能会更好(未测试):
public class MyMapper
{
public static TDestination Map<TDestination>(object source) where TDestination : class
{
if(source is TDestination)
{
return (TDestination) source; //short-circuit here
}
return Mapper.Map<TDestination>(source);
}
public static TDestination Map<TSource, TDestination>(TSource source, TDestination destination)
{
return Mapper.Map<TSource, TDestination>(source, destination);
}
}
我一直在使用 AutoMapper 在接口和该接口的具体实现之间进行映射。我假设如果我传递给 AutoMapper 的 Map<TDestination>
方法的类型与 return 类型相同,那么原始对象将被 returned(作为一种短路手术)。我的假设是错误的:事实上,在查看之后我注意到该方法的文档明确指出:
Execute a mapping from the source object to a new destination object. The source type is inferred from the source object. (bold emphasis mine)
我打开这个快速控制台应用程序只是为了验证:
using System;
using AutoMapper;
namespace ConsoleApplication
{
class Program
{
interface IFoo
{
string Bar { get; }
}
class Foo : IFoo
{
public string Bar { get; set; }
}
static void Main(string[] args)
{
Mapper.CreateMap<IFoo, Foo>();
IFoo a = new Foo { Bar = "baz" };
Foo b = Mapper.Map<Foo>(a);
Console.WriteLine(Object.ReferenceEquals(a, b)); // false
}
}
}
现在我知道了这种行为,我可以针对我的特定用例围绕它进行优化,但我想知道是否有使用 AutoMapper 的替代方法,它将 "short-circuit" 以上述方式(即,如果类型与我想要的目标类型相同,则返回原始对象)?
您可以使用 Mapper.Map<TSource,TDestination>(source, destination)
重载。
Foo b = new Foo();
Mapper.Map<IFoo,Foo>(a,b);
AutoMapper 将使用 b 而不是构建新对象。总体而言,您可以在 Mapper.Map 周围使用包装器,这种替代方法可能会更好(未测试):
public class MyMapper
{
public static TDestination Map<TDestination>(object source) where TDestination : class
{
if(source is TDestination)
{
return (TDestination) source; //short-circuit here
}
return Mapper.Map<TDestination>(source);
}
public static TDestination Map<TSource, TDestination>(TSource source, TDestination destination)
{
return Mapper.Map<TSource, TDestination>(source, destination);
}
}