对带有构造函数参数的AutoMapper ValueResolver使用依赖注入

本文关键字:ValueResolver 依赖 注入 AutoMapper 构造函数 参数 | 更新日期: 2023-09-27 18:12:29

我有以下自定义值解析器:

public class ImageUrlResolver<T> : ValueResolver<T, string>
{
    private readonly ISettings _settings;
    public ImageUrlResolver(string size)
    {
        _settings = ObjectFactory.GetInstance<ISettings>();
    }
    ...
}
.ForMember(d => d.ImageUrl, 
    o => o.ResolveUsing<ImageUrlResolver>().ConstructedBy(() => new ImageUrlResolver("150x150"))

我试图更新它,这样我就可以注入StructureMap的IContainer,而不是使用ObjectFactory,但我不确定如何在它有构造函数参数时构建解析器。还有什么我能做的吗?

对带有构造函数参数的AutoMapper ValueResolver使用依赖注入

我想到一个解决办法了。我现在将IContainer注入到配置文件中,并将其传递给解析器。

public static void Initialise(IContainer container)
{
    var type = typeof(Profile);
    var profiles = AppDomain.CurrentDomain
                            .GetAssemblies()
                            .SelectMany(a => a.GetTypes())
                            .Where(t => type.IsAssignableFrom(t) && type != t)
                            .Select(container.GetInstance)
                            .Cast<Profile>()
                            .ToList();
    Mapper.Initialize(c =>
        {
            profiles.ForEach(c.AddProfile);
            c.ConstructServicesUsing(container.GetInstance);
        });
}
public class MyProfile : Profile
{
    private readonly IContainer _container;
    public MyProfile(IContainer container)
    {
        _container = container;
    }
    private static void Configure()
    {
        Mapper.CreateMap<Entity, Model>()
            .ForMember(d => d.ImageUrl, o => o.ResolveUsing<ImageUrlResolver>().ConstructedBy(() => new ImageUrlResolver(_container, "150x150"))
    }
}

也许不是最干净的解决方案,但这是我发现的唯一可行的解决方案。