此解析操作已经结束。 Autofac,Automapper和IMemberValueResolver

时间:2018-10-29 14:39:07

标签: c# asp.net asp.net-mvc automapper autofac

我对Autofac和Automapper有问题。

在我的WebApi中,我有以下代码来注册我的课程:

    public static void Initialize(HttpConfiguration config, IContainer container)
        {
            config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
            _container = container;
        }

        private static IContainer RegisterServices(ContainerBuilder builder)
        {
            //Register your Web API controllers.  
            builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

            builder.RegisterModule<MapperInstaller>();
            builder.RegisterType<VurpEntities>();
            builder.RegisterType<EntityFrameworkUnitOfWork>().As<IUnitOfWork>();

            builder.RegisterType<AppService>().As<IAppService>();
            builder.RegisterType<AppRepository>().As<IAppRepository>();

            builder.RegisterType<BusinessService>().As<IBusinessService>();
            builder.RegisterType<BusinessRepository>().As<IBusinessRepository>();

//...
//all my types are registered here
//...



            //Set the dependency resolver to be Autofac.  
            _container = builder.Build();

            return _container;
        }

我创建了一个解析器来映射对象的特殊字段:

public class ProductTypeResolver : IMemberValueResolver<ProductDto, Product, string, Enumeration.ProductType>
    {
        public ProductType Resolve(ProductDto source, Product destination, string sourceMember, ProductType destMember, ResolutionContext context)
        {
            Enum.TryParse(sourceMember, out destMember);

            return destMember;
        }
    }

我有一个将DTO对象映射到Entity对象的Profile:

CreateMap<ProductDto, Product>()
            .ForMember(dest => dest.Category, opt => opt.Ignore())
            .ForMember(dest => dest.Feature, opt => opt.Ignore())
opts.ResolveUsing<ProductTypeResolver, string>(src => src.type));

当我尝试映射对象Product p = _mapper.Map<Product>(productDto);时,收到错误消息:

  

类型为'System.ObjectDisposedException'的异常发生在   Autofac.dll,但未在用户代码中处理

     

其他信息:此解析操作已经结束。什么时候   使用lambda注册组件,IComponentContext'c'   lambda的参数无法存储。相反,要么解决   再次从“ c”返回IComponentContext,或将基于Func <>的工厂解析为   从中创建后续组件。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

我解决了这个问题

    builder.Register(c =>
    {
        //This resolves a new context that can be used later.
        var context = c.Resolve<IComponentContext>();
        var config = context.Resolve<MapperConfiguration>();
        return config.CreateMapper(context.Resolve);
    })
    .As<IMapper>()
    .InstancePerLifetimeScope();