这是我的代码:
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();
}
完成。谢谢