我创建了一个web api core 2.0应用程序。 我有我的主应用程序和业务层。 我想将automapper配置文件放在业务层中,以便在业务层中进行所有映射。我的业务层只是一个类库项目。
这可能吗?或者我是否需要将所有映射放在主应用程序的Profile类中?
只是一个理论上的解释可以帮助。
答案 0 :(得分:4)
是的,这是可能的,但这取决于模型类所在的位置。
您可以为每个图层或项目赋予Profile
映射相应模型类的位置。然后在要使用映射器的项目中,创建ObjectMapper
类以加载配置文件。
namespace BL.Config
{
public class MapperProfile : Profile
{
public MapperProfile()
{
CreateMap<Entity, Dto>();
...
}
}
public class ObjectMapper
{
public static IMapper Mapper
{
get { return mapper.Value; }
}
public static IConfigurationProvider Configuration
{
get { return config.Value; }
}
public static Lazy<IMapper> mapper = new Lazy<IMapper>(() =>
{
var mapper = new Mapper(Configuration);
return mapper;
});
public static Lazy<IConfigurationProvider> config = new Lazy<IConfigurationProvider>(() =>
{
var config = new MapperConfiguration(cfg =>
{
cfg.AddProfile<BL.Config.MapperProfile>();
cfg.AddProfile<AppCore.Config.MapperProfile>(); // any other profiles you need to use
});
return config;
});
}
}
当我需要使用AutoMapper时,我使用ObjectMapper.Mapper
来获取我的mapper实例。我想将它添加到抽象服务中。
public interface IAutoMapperService
{
IMapper Mapper { get; }
}
public abstract class AutoMapperService : IAutoMapperService
{
public IMapper Mapper
{
get { return BAL.Config.ObjectMapper.Mapper; }
}
}
用法:该服务具有Mapper成员。
public class SomeService : AutoMapperService, ISomeService
{
public Foo GetFoo()
{
var foo = Mapper.Map<Foo>(bar);
return foo;
}
}
如果你不能继承另一个基类,只需实现IAutoMapperService
。
缺点是BL需要AutoMapper依赖。但是使用这种方式我发现我可以隐藏其他层中的许多模型。