3

我想知道是否有办法在使用依赖注入时全局配置 Mapster?

配置选项似乎仅用于静态使用,也仅用于单例模式。

映射器配置

Mapster 依赖注入

我创建了一个扩展方法。

// Extension method
public static IServiceCollection AddMapster(this IServiceCollection services, Action<TypeAdapterConfig> options = null)
{
    var config = new TypeAdapterConfig();
    config.Scan(Assembly.GetAssembly(typeof(Startup)));

    options?.Invoke(config);

    services.AddSingleton(config);
    services.AddScoped<IMapper, ServiceMapper>();

    return services;
}

// Called in Startup.ConfigureServices(IServiceCollection services)
services.AddMapster(options =>
{
    options.Default.IgnoreNonMapped(true); // Does not work.
    TypeAdapterConfig.GlobalSettings.Default.IgnoreNonMapped(true); // Does not work.
});

我想这些不起作用,因为它ServiceMapper正在创建自己的实例而不使用我配置的任何东西。

4

2 回答 2

5

Mapster在 Blazor Server 应用程序中实现,并且努力寻找有关如何扫描程序集以进行映射注册的文档。

我的应用程序中有一个实现IRegister接口并定义映射的类

public class MappingRegistration : IRegister
{
    void IRegister.Register(TypeAdapterConfig config)
    {
        config.NewConfig<ModelA, ModelB>();
    }
}

在我ConfigureServicesStartup.cs这个然后

var typeAdapterConfig = TypeAdapterConfig.GlobalSettings;
// scans the assembly and gets the IRegister, adding the registration to the TypeAdapterConfig
typeAdapterConfig.Scan(Assembly.GetExecutingAssembly());
// register the mapper as Singleton service for my application
var mapperConfig = new Mapper(typeAdapterConfig);
services.AddSingleton<IMapper>(mapperConfig);

我希望这可以节省某人的时间。如果有人知道更好的方法,请告诉我。

于 2021-04-14T14:47:09.823 回答
2

你可以从

var config = new TypeAdapterConfig();

var config = TypeAdapterConfig.GlobalSettings;
于 2020-04-14T00:02:03.240 回答