我正在编写一些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。
答案 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用于不同的层。