gpt4 book ai didi

c# - 使用 NInject 注入(inject) autommaper 映射器

转载 作者:行者123 更新时间:2023-11-30 23:24:15 25 4
gpt4 key购买 nike

我想使用 NInject 将 AutoMapper.IMapper 单个实例作为 singleton 注入(inject)。

实际上,我正在使用 AutoMapper 从/到对象取消/映射静态 API。它已经过时了,我期待着利用这个机会使用 NInject 注入(inject)它。 .

目前,我正在使用这段代码来创建我的 IMapper 实例:

AutoMapper.Mapper.AddProfile(new UI.Mappings.Profiles.DigitalResourceProfile());
AutoMapper.Mapper.AddProfile(new UI.Mappings.Profiles.DigitalInputProfile());
AutoMapper.Mapper.AddProfile(new UI.Mappings.Profiles.FollowUpActivityProfile());
AutoMapper.Mapper.AddProfile(new UI.Mappings.Profiles.ResourceProfile());

如您所见,我还有一些配置文件要初始化。

我应该如何构建所有这些?

到目前为止,我只能创建一个模块,但我不知道如何进行绑定(bind)。

public class AutoMapperModule : Ninject.Modules.NinjectModule
{
public override void Load()
{
this.Bind<AutoMapper.MapperConfiguration>().ToProvider<AutoMapperconfigurationProvider>().InSingletonScope();
this.Bind<AutoMapper.IMapper>().To<AutoMapper.Mapper>();

}

private class AutoMapperconfigurationProvider : IProvider<AutoMapper.MapperConfiguration>
{

public object Create(IContext context)
{
AutoMapper.MapperConfiguration instance = new AutoMapper.MapperConfiguration(
cfg =>
{
cfg.AddProfile(new UI.Mappings.Profiles.DigitalResourceProfile());
cfg.AddProfile(new UI.Mappings.Profiles.DigitalInputProfile());
cfg.AddProfile(new UI.Mappings.Profiles.FollowUpActivityProfile());
cfg.AddProfile(new UI.Mappings.Profiles.ResourceProfile());
}
);

return instance;
}

public Type Type
{
get { throw new NotImplementedException(); }
}
}
}

每次我需要一个IMapper来映射对象时,我都想写这句话:

IMapper mapper = kernel.Get<IMapper>();

有什么想法吗?

最佳答案

我对此进行了调查。

我发现了以下内容:

在文档中我们可以发现我们可以这样做:

var config = new MapperConfiguration(cfg => {
cfg.AddProfile<SomeProfile>();
cfg.CreateMap<Source, Dest>();
});

var mapper = config.CreateMapper(); // option 1
// or
var mapper = new Mapper(config); // option 2

您的代码可以使用 option 2 ,因为您对 configuration 具有约束力和 mapper .

但是这里我们有两个问题。1)您需要将第一个绑定(bind)更改为绑定(bind) MapperConfiguration作为接口(interface) IConfigurationProvider因为 Mapper 的构造函数需要它:

public Mapper(IConfigurationProvider configurationProvider)
: this(configurationProvider, configurationProvider.ServiceCtor)
{
}

但是这里我们遇到了第二个问题。

2) 在 automapper 4.2.1 版 中(我相信您是从 NuGet 下载的)Mapper类只有 internal构造函数。它在文档中有一个公共(public)构造函数(这很奇怪),我认为在未来的版本中会有。

因此,现在您需要修改Load使用方法option 1 :

public override void Load()
{
this.Bind<AutoMapper.MapperConfiguration>().ToProvider<AutoMapperconfigurationProvider>().InSingletonScope();
this.Bind<AutoMapper.IMapper>().ToMethod(context => context.Kernel.Get<MapperConfiguration>().CreateMapper());
}

然后你可以调用IMapper mapper = kernel.Get<IMapper>();获取映射器实例。

它将使用 public IMapper CreateMapper() => new Mapper(this);并将创建 IMapper 的实例。注意:您需要使用 MapperConfiguration(不是 IConfiguration 提供程序)来调用 CreateMapper方法,它与 Mapper 的公共(public)/内部构造函数具有相同的情况。 .

这应该有所帮助。

关于c# - 使用 NInject 注入(inject) autommaper 映射器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37881639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com