Эта операция разрешения уже завершена. Autofac, Automapper и IMemberValueResolver - PullRequest
0 голосов
/ 29 октября 2018

У меня проблема с 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;
        }

Я создал Resolver для сопоставления специального поля моего объекта:

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:

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, но не был обработан в коде пользователя

Дополнительная информация: Эта операция разрешения уже завершена. когда регистрация компонентов с использованием лямбда-выражения, IComponentContext 'c' Параметр лямбда не может быть сохранен. Вместо этого либо разрешите IComponentContext снова из 'c' или разрешите фабрику на основе Func <> в создать последующие компоненты из.

Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 30 октября 2018

Я решил с этим:

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