Automapper-项目内部有一些静态类吗?

时间:2018-10-08 13:47:11

标签: c# automapper

我正在编写一些Web API应用程序,其中有4个基本层-API,BusinessLogic(我称其为BusinessServices),DAL(使用EF与数据库对话)和EntitiesData(其中有我的实体)。

API调用businessService,bs问DAL,使用EF的DAL向数据库询问我的EntitiesData。

好的,现在出了什么问题;)

在BusinessServices上,我想将实体映射到某些DTO,然后可以返回API。 我想使用AutoMapper,但在教程中,确实有一些简单的示例,据我所知。

第一个问题:我应该使用2个IoC容器吗?或者将我的IOC从API移到业务服务层? 第一个容器处于API级别,并且包含BusinessServices(例如UsesrsService,MessageService等) 第二个容器位于BusinessServices级别-我想用它来存储我的AutoMapper映射。

这是第二个问题-我应该如何使用AutoMapper。 我知道,如何创建配置,确实是这样的:

private void Congifure()
{
    if(!(configuration == null))
        return;

    var config = new MapperConfiguration(cfg =>
    {
        cfg.CreateMap<User, UserDto>();
        cfg.CreateMap<Message,MessageDto>();
    });
}

但是我现在应该怎么办?将其包装到IoC容器中? 我应该从代码的哪个位置调用配置映射器的类? 在businessServices中,只有我的业务逻辑类和DTO。

2 个答案:

答案 0 :(得分:0)

您可以将其打包到Startup.cs ConfigureServices方法中:

var config = new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<User, UserDto>();
                cfg.CreateMap<Message,MessageDto>();
            });
var mapper = config.CreateMapper();
services.AddScoped<AutoMapper.IMapper>(c => mapper);

然后将其注入您的班级:

public class MyService
{
    public MyService(IMapper mapper)
    {
        ...
    }
}

我将使用一个映射器,并将其放置在垂直于您图层的某个位置,例如放入“ helpers”项目中。您的映射器必须在不同的图层之间进行映射,因此它应该位于它们之间。只需将创建MapperConfiguration的逻辑移到单独的项目中,然后从Startup.cs中调用它即可。

答案 1 :(得分:0)

自动映射器文档中的very first thing涉及初始化。这应该在引导IOC容器的任何地方进行。

您只需要1个IOC容器,将2变成使它们无用,因为您会将依赖树分成两半。

您应该考虑将mapping profiles用于不同的层。