我想在我的业务层中放置Automapper配置文件

时间:2018-03-16 03:30:53

标签: asp.net-core .net-core automapper asp.net-core-2.0 asp.net-core-webapi

我创建了一个web api core 2.0应用程序。 我有我的主应用程序和业务层。 我想将automapper配置文件放在业务层中,以便在业务层中进行所有映射。我的业务层只是一个类库项目。

这可能吗?或者我是否需要将所有映射放在主应用程序的Profile类中?

只是一个理论上的解释可以帮助。

enter image description here

1 个答案:

答案 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依赖。但是使用这种方式我发现我可以隐藏其他层中的许多模型。