如何使用我的配置初始化我的自动映射器



这是我的代码:

My Initializer Class
public class Initializer : IMapInitializer
{
IMapInitializer _mapInitializer;
public Initializer(IMapInitializer mapInitializer)
{
_mapInitializer = mapInitializer;
}
public void Initialize()
{
Mapper.Initialize(config =>
{
config.CreateMap<OrderMain, OrderDO>().ReverseMap();
//Others
.....
});
}
}

这是 IMapInitializer

public interface IMapInitializer
{
void Initialize();
}

我可以在启动.cs中做什么?我试过

服务。添加瞬态((

只需在 Startup.Configure 方法中调用 Mapper.Initialize 一次,无需涉及 DI 容器:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
Mapper.Initialize(c =>
{
c.CreateMap<Order, OrderDto>();
c.CreateMap<SomethingElse, SomethingElseDto>();
//etc...
});
//snip...
}

然后,只要您调用 map,您的映射将可用:

var dto = Mapper.Map<OrderDto>(myOrder);


编辑

因此,如果确实要通过在 DI 容器中注册的类初始化映射,请执行以下操作:

定义您的接口(与您已经完全一样(:

public interface IMapInitializer
{
void Initialize();
}

实现它,你只需要接口的实现,如果你想在 Initializer 类中注入不同的依赖项,你只需要在构造函数中包含其他接口(例如,一个记录器也需要向 DI 容器注册(:

public class Initializer : IMapInitializer
{
public void Initialize()
{
Mapper.Initialize(config =>
{
config.CreateMap<OrderMain, OrderDTO>().ReverseMap();
//Others
});
}
}

然后在 DI 容器中向 AddTransient (将在需要时创建类(、AddScoped(每个请求创建一次(或 AddSingleton(每个应用的生存期创建一次(注册此容器。我在这里使用scoped,因为您可能只想使用它一次,因为一旦您创建了映射,它们将在应用程序的生命周期内可用:

services.AddScoped<IMapInitializer, Initializer>();

现在,您可以使用 DI 容器将上述内容注入到需要它的任何内容中,例如注入控制器:

public class MyController : Controller
{
private IMapInitializer _initializer = null;
public MyController(IMapInitializer initializer)
{
_initializer = initializer ?? throw new ArgumentException(nameof(initializer));
}
public IActionResult Get()
{
//initialize - although once you've done this you don't need to do so again!
initializer.Initialize();
//use mappings...
}
}

我创建的静态初始值设定项将从配置服务调用

public static class MapperInitializer
{
public static void MapperConfiguration()
{
Mapper.Initialize(config =>
{
//Configs..
});
}
}

我喜欢这个。

public void ConfigureServices(IServiceCollection services)
{
MapperInitializer.MapperConfiguration();
}

完成。谢谢

最新更新