AutoMapper 4.2 and Ninject 3.2

本文关键字:Ninject and AutoMapper | 更新日期: 2023-09-27 18:33:29

我正在更新我的一个项目以使用 AutoMapper 4.2,但我遇到了重大更改。虽然我似乎已经解决了上述更改,但我并不完全相信我已经以最合适的方式这样做了。

在旧代码中,我有一个NinjectConfiguration,和一个AutoMapperConfiguration类,每个类都由WebActivator加载。在新版本中,AutoMapperConfiguration 退出,而是直接在发生绑定的 NinjectConfiguration 类中实例化MapperConfiguration,如下所示:

private static void RegisterServices(
    IKernel kernel) {
    var profiles = AssemblyHelper.GetTypesInheriting<Profile>(Assembly.Load("???.Mappings")).Select(Activator.CreateInstance).Cast<Profile>();
    var config = new MapperConfiguration(
        c => {
            foreach (var profile in profiles) {
                c.AddProfile(profile);
            }
        });
    kernel.Bind<MapperConfiguration>().ToMethod(
        c =>
            config).InSingletonScope();
    kernel.Bind<IMapper>().ToMethod(
        c =>
            config.CreateMapper()).InRequestScope();
    RegisterModules(kernel);
}

那么,这是使用 Ninject 绑定 AutoMapper 4.2 的合适方式吗?到目前为止,它似乎正在工作,但我只是想确定一下。

AutoMapper 4.2 and Ninject 3.2

在 IMapper 接口之前,库中不存在接口,因此您必须实现下面的接口和类,并将它们绑定为单例模式。

public interface IMapper
{
    T Map<T>(object objectToMap);
}
public class AutoMapperAdapter : IMapper
{
    public T Map<T>(object objectToMap)
    {
        //Mapper.Map is a static method of the library!
        return Mapper.Map<T>(objectToMap);
    }
}

现在,您只需将库的 IMapper 接口绑定到 mapperConfiguration.CreateMapper() 的单个实例

你的代码的问题,你应该使用单个实例(或如Ninject所说,一个常量)绑定。

// A reminder
var config = new MapperConfiguration(
    c => {
        foreach (var profile in profiles) {
            c.AddProfile(profile);
        }
    });
// Solution starts here
var mapper = config.CreateMapper();
kernel.Bind<IMapper>().ToConstant(mapper);