Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何用Autofac注入AutoMapper?_C#_Asp.net Mvc_Dependency Injection_Automapper_Autofac - Fatal编程技术网

C# 如何用Autofac注入AutoMapper?

C# 如何用Autofac注入AutoMapper?,c#,asp.net-mvc,dependency-injection,automapper,autofac,C#,Asp.net Mvc,Dependency Injection,Automapper,Autofac,将AutoMapper注入其他层的正确方法是什么 我读过这篇博客,但这段代码导致了下面的异常 AutoMapper.dll中发生类型为“AutoMapper.AutoMappingException”的异常,但未在用户代码中处理 尝试在服务层中映射时 List<StudentViewModel> list2 = _mapper.Map<List<StudentViewModel>>(list); List list2=\u mapper.Map(List);

将AutoMapper注入其他层的正确方法是什么

我读过这篇博客,但这段代码导致了下面的异常

AutoMapper.dll中发生类型为“AutoMapper.AutoMappingException”的异常,但未在用户代码中处理

尝试在服务层中映射时

List<StudentViewModel> list2 = _mapper.Map<List<StudentViewModel>>(list);
List list2=\u mapper.Map(List);
我的AutoFac配置如下所示:

public static class DependencyRegistration
{
    public static void Config()
    {
        var builder = new ContainerBuilder();

        builder.RegisterControllers(typeof(MvcApplication).Assembly);


        builder.RegisterType<TypeMapFactory>().As<ITypeMapFactory>();
        builder.RegisterType<ConfigurationStore>().As<ConfigurationStore>().WithParameter("mappers", MapperRegistry.Mappers).SingleInstance();
        builder.Register((ctx, t) => ctx.Resolve<ConfigurationStore>()).As<IConfiguration>().As<IConfigurationProvider>();
        builder.RegisterType<MappingEngine>().As<IMappingEngine>();

        //...
        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }
}
公共静态类依赖项注册
{
公共静态void Config()
{
var builder=new ContainerBuilder();
注册控制器(类型化(MVCAPApplication).Assembly);
builder.RegisterType().As();
builder.RegisterType().As().WithParameter(“mappers”,MapperRegistry.mappers).SingleInstance();
builder.Register((ctx,t)=>ctx.Resolve()).As().As();
builder.RegisterType().As();
//...
var container=builder.Build();
SetResolver(新的AutofacDependencyResolver(容器));
}
}

您似乎需要使用容器中注册的
IConfiguration
对象来创建以下贴图:

var configuration = container.Resolve<IConfiguration>();
configuration.CreateMap<Student, StudentViewModel>();
在上一个示例中,我假设您的类只需要访问
IMappingEngine
(而不是
IConfiguration
),因为您应该已经在
Config
方法(或应用程序启动时的某些其他配置方法)中设置了所有映射 Autofac 5.1.2 AutoMapper 9.0.0 自动映射配置文件->我的配置文件名称

protected override void Load(ContainerBuilder生成器)
{
builder.RegisterType().As();
builder.Register(c=>newmapperconfiguration(cfg=>
{
foreach(c.Resolve()中的变量配置文件)
{
cfg.AddProfile(profile);
}
})).AsSelf().SingleInstance();
builder.Register(c=>c.Resolve().CreateMapper(c.Resolve)).As().InstancePerLifetimeScope();
}

您是否在要转换的类型之间创建了映射?异常消息是什么?@YacoubMassad是的,我创建了配置文件类并注册了它们。@YacoubMassad{“缺少类型映射配置或映射不受支持。\r\n\r\n映射类型:\r\n学生->学生视图模型\r\nDomainModels.Student->视图模型.StudentViewModel\r\n\r\n目标路径:\r\n列表`1[0]\r\n\r\n源值:\r\n系统.数据.实体.动态路径.学生\u 56CF505FEBA6F48D4BC4909754F9D134C329E2A4B2B62D9E22D000950B16”}”你能展示你创建地图的代码吗?你说在配置文件类中这样做?如何获取容器?不,我建议你在
DependencyRegistration
类中这样做谢谢你的回答,我有一些复杂的配置文件类,我想自动映射器配置转移到DependencyRegistration类是个好主意吗?@ramin\u rp,我我不确定我是否理解您的问题。但我认为您可以轻松创建另一个类来注册AutoMapper映射,并从此
Config
方法调用它。上面的代码导致AutoMappingException“AutoMapper.dll中发生了类型为“AutoMapper.AutoMappingException”的异常,但未在用户代码中处理”
public static void Config()
{
    var configuration_store = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.Mappers);

    var mapping_engine = new MappingEngine(configuration_store);

    configuration_store.CreateMap<Student, StudentViewModel>();

    var builder = new ContainerBuilder();

    builder.RegisterInstance(mapping_engine).As<IMappingEngine>();

    //...
    var container = builder.Build();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}