在Azure函数中初始化AutoMapper

lxkprmvk  于 2022-11-17  发布在  其他
关注(0)|答案(2)|浏览(131)

我正在尝试创建一个Azure函数,其中我使用了AutoMapper的一些代码。我对C#、Azure和AutoMapper相当陌生,我在找到初始化AutoMapper配置的正确方法时遇到了一些麻烦。

Map初始化程序.cs:

public static class MapInitializer
    {
        public static void Activate()
        {
            Mapper.Initialize(cfg =>
            {
                // initialize mappings here
            });
        }
    }

然后在我的函数中,我尝试执行以下操作:

函数.cs:

public static class ProcessQueueForIntercom
    {

        [FunctionName("ProcessQueue")]
        public static void Run([QueueTrigger("messages")]string myQueueItem, TraceWriter log)
        {
            MapInitializer.Activate(); 

            // rest of the code
        }
    }

现在的问题是,我第一次用这个函数处理消息时,一切都很顺利,代码按我预期的运行。但是,从第二次开始,我得到一个错误,说我的配置已经初始化。但我真的不知道如何用Azure函数正确地完成这一点,因为通常你会在应用程序启动中初始化它。但我不认为Azure Functions(CMIW)有这样的功能,而且我也没有找到很多关于如何准确实现这一点的信息。我想用一个try catch来包围Activate()调用,并记录一个警告,说明配置已经加载,但这似乎不是很清楚。

j91ykkif

j91ykkif1#

你只需要调用Activate一次。你可以通过一个静态构造函数来实现:

public static class ProcessQueueForIntercom
{
    static ProcessQueueForIntercom()
    {
        MapInitializer.Activate();
    }

    [FunctionName("ProcessQueue")]
    public static void Run([QueueTrigger("messages")]string myQueueItem, TraceWriter log)
    {             
        // rest of the code
    }
}

或者只在MapInitializer本身上创建一个静态构造函数。
另请参阅this answer

lf5gs5x2

lf5gs5x22#

由于静态Mapper.Initialize API现在已经正式失效,我认为最好的解决方案是在函数类构造函数中注入一个Map器。

using AutoMapper;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using YourNamespace.Models;

[assembly: FunctionsStartup(typeof(YourNamespace.Startup))]

namespace YourNamespace
{
    class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            var mappperConfig = new MapperConfiguration(cfg =>
                {
                cfg.CreateMap<User, UserResponse>(); 
                // you can have the maps in a dedicated Profile subclass if you like
            });
            builder.Services.AddSingleton(mappperConfig.CreateMapper());
        }
    }
}

然后,将自动Map器注入到函数类中,如下所示:

public class UsersApi
{
    private readonly IMapper _mapper;

    public UsersApi(IMapper mapper)
    {
        _mapper = mapper; 
    }

    [FunctionName(nameof(UsersApi.GetUser))]
    public async Task<IActionResult> GetUser(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "users/{id}")] HttpRequest req,
        ILogger log,
        string id)
    {
        User user = await UserRepository.GetUser(id);
        UserResponse res = _mapper.Map<UserResponse>(user);
        return new OkObjectResult(res);
    }
}

相关问题