Как передать значение в пользовательский ValueResolver? - PullRequest
3 голосов
/ 15 февраля 2012

Я борюсь с форматом для передачи значения в пользовательский ValueResolver.Я в основном пытаюсь преобразовать Int в и Object на основе моей ViewModel.Тем не менее, я не могу заставить его передать значение в мой ValueResolver

У меня есть следующий Custom ValueResolver:

public class CustomResolver : ValueResolver<CreateContainerViewModel, Container>
{ 
    private int id = 0;

    public CustomResolver(int? sourceId)
    {
        if(sourceId.HasValue)
            id = sourceId.Value;
    }
    protected override Container ResolveCore(CreateContainerViewModel source)
    {
        if (id == 0) return null;
        else
        {
            ISession _session = DependencyResolver.Current.GetService<ISessionFactory>().GetCurrentSession();
            return _session.Get<Container>(id);
        }
    }
}

Он отлично работает, когда я создаю карту с использованием жестко закодированного типа intследующий код

Mapper.CreateMap<CreateContainerViewModel, Container>()
.ForMember(a => a.CurrentContainer, opt => opt.ResolveUsing(src => new CustomResolver(33)));

, но он не работает (исключение отображения), когда я пытаюсь получить значение из моей модели представления

Mapper.CreateMap<CreateContainerViewModel, Container>()
            .ForMember(dest => dest.CurrentContainer, opt => opt.MapFrom(src => new CustomResolver(src.CurrentContainerId)));

Может ли кто-нибудь указать мне в направленииправильный синтаксис для передачи значения в пользовательский ValueResolver?

Спасибо

ОБНОВЛЕНИЕ:

в основном пытается написать что-то вроде этого:

  public class IdToObjectResolver<T> : ValueResolver<int, T> where T : class
{ 
    private ISession _session;
    private int id;
    public IdToObjectResolver(Nullable<int> sourceId)
    {
        _session = DependencyResolver.Current.GetService<ISessionFactory>().GetCurrentSession();
        if(sourceId.HasValue)
            id = sourceId.Value;
    }

    protected override T ResolveCore(int source)
    {
        return _session.Get<T>(source);
    }
}

Этот код в настоящее время не имеет смысла, но просто пытается получить способ передачи в int ...

1 Ответ

1 голос
/ 16 февраля 2012

Если я правильно понимаю, я думаю, что вы могли бы немного усложнить ValueResolver. Как видите, весь класс CreateContainerViewModel отправляется в методе ResolveCore в ValueResolver. Это будет весь исходный объект со значениями.

Следовательно, вы должны быть в состоянии извлечь значение идентификатора из исходного объекта, используя это отображение: opt.ResolveUsing(src => new CustomResolver()). (без конструктора arg).

Надеюсь, это поможет.

EDIT:

Мой тест:

        [TestMethod]
        public void TestMethod1()
        {
            Mapper.CreateMap<CreateContainerViewModel, Container>()
                .ForMember(a => a.CurrentContainer, opt => opt.ResolveUsing<CustomResolver>());


            var source = new CreateContainerViewModel()
            {
                ID = 3
            };

            var destination = new Container();

            Mapper.Map(source, destination);

            Assert.AreEqual(destination.CurrentContainer.ID, 3);

        }

CustomResolver:

public class CustomResolver : ValueResolver<CreateContainerViewModel, Container>
{
    protected override Container ResolveCore(CreateContainerViewModel source)
    {

            return new Container() { ID = source.ID };  
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...