3

I have a problem with Autofac and Automapper.

In my WebApi I have this code to register my classes:

    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;
        }

I created a Resolver to map a special field of my object:

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;
        }
    }

I have a Profile that map DTO object in Entity object:

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

When I try to map the object Product p = _mapper.Map<Product>(productDto); I receive the error:

An exception of type 'System.ObjectDisposedException' occurred in Autofac.dll but was not handled in user code

Additional information: This resolve operation has already ended. When registering components using lambdas, the IComponentContext 'c' parameter to the lambda cannot be stored. Instead, either resolve IComponentContext again from 'c', or resolve a Func<> based factory to create subsequent components from.

Anyone can help me?

1 Answers1

6

I solved with this:

    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();