ValueInjecter вопрос - PullRequest
       49

ValueInjecter вопрос

3 голосов
/ 03 марта 2011

После работы с AutoMapper я наткнулся на ValueInjecter на этом сайте. Я пробую это, но я застрял в том, что, вероятно, очень простой сценарий.

Но прежде чем копаться в примере кода, кто-нибудь знает, работает ли ValueInjecter в веб-среде Medium-Trust? (Как Godaddy?)

Хорошо, на код! У меня есть следующие модели:

public class NameComponent 
{
    public string First { get; set; }
    public string Last { get; set; }
    public string MiddleInitial { get; set; }
}
public class Person
{
    public NameComponent Name { get; set; }
}

, который я хочу сопоставить со следующим DTO:

public class PersonDTO : BaseDTO
{
    private string _firstName;
    public string FirstName
    {
        get { return _firstName; }
        set { NotifyPropertyChanged(() => FirstName, ref _firstName, value); }
    }

    private string _middleInitial;
    public string MiddleInitial
    {
        get { return _middleInitial; }
        set { NotifyPropertyChanged(() => MiddleInitial, ref _middleInitial, value); }
    }

    private string _lastName;
    public string LastName
    {
        get { return _lastName; }
        set { NotifyPropertyChanged(() => LastName, ref _lastName, value); }
    }
}

Поэтому, когда я хочу отобразить модель из DTO, мне нужен Model.Name.First -> DTO.FirstName и при переходе от DTO к Model мне нужно FirstName -> Name.First. Насколько я понимаю, это не просто Flatten / UnFlatten, потому что слова также меняются местами, то есть: FirstName <-> Name.First. Таким образом, имена и фамилии могут использовать одно и то же правило, но как насчет MiddleInitial? Model.Name.MiddleInitial -> DTO.MiddleInitial.

Я вижу, что есть некоторые плагины, но ни один из них, кажется, не делает то, что я хотел бы. Кто-нибудь еще сталкивался с этим сценарием?

1 Ответ

1 голос
/ 03 марта 2011

Основная идея состоит в том, что я сопоставляю Name с FirstName, я принимаю это как точку поворота, и в методе, который обычно устанавливает значение только для одного свойства (FirstName), я устанавливаю его в 3 свойства- это для FromNameComp

в ToNameComp я соответствую тем же свойствам, но я беру значение из 3 и создаю его и устанавливаю его

    public class SimpleTest
    {
        [Test]
        public void Testit()
        {
            var p = new Person { Name = new NameComponent { First = "first", Last = "last", MiddleInitial = "midd" } };
            var dto = new PersonDTO();
            dto.InjectFrom<FromNameComp>(p);

            Assert.AreEqual(p.Name.First, dto.FirstName);
            Assert.AreEqual(p.Name.Last, dto.LastName);
            Assert.AreEqual(p.Name.MiddleInitial, dto.MiddleInitial);

            var pp = new Person();
            pp.InjectFrom<ToNameComponent>(dto);

            Assert.AreEqual(dto.LastName, pp.Name.Last);
            Assert.AreEqual(dto.FirstName, pp.Name.First);
            Assert.AreEqual(dto.MiddleInitial, pp.Name.MiddleInitial);

        }

        public class FromNameComp : ConventionInjection
        {
            protected override bool Match(ConventionInfo c)
            {
                return c.SourceProp.Name == "Name" && c.SourceProp.Type == typeof(NameComponent)
                    && c.TargetProp.Name == "FirstName"
                       && c.SourceProp.Value != null;
            }

            protected override object SetValue(ConventionInfo c)
            {
                dynamic d = c.Target.Value;
                var nc = (NameComponent)c.SourceProp.Value;
                //d.FirstName = nc.First; return nc.First does this
                d.LastName = nc.Last;
                d.MiddleInitial = nc.MiddleInitial;
                return nc.First;
            }
        }

        public class ToNameComponent : ConventionInjection
        {
            protected override bool Match(ConventionInfo c)
            {
                return c.TargetProp.Name == "Name" && c.TargetProp.Type == typeof(NameComponent)
                       && c.SourceProp.Name == "FirstName";
            }

            protected override object SetValue(ConventionInfo c)
            {
                dynamic d = c.Source.Value;
                var nc = new NameComponent { First = d.FirstName, Last = d.LastName, MiddleInitial = d.MiddleInitial };
                return nc;
            }
        }

        public class NameComponent
        {
            public string First { get; set; }
            public string Last { get; set; }
            public string MiddleInitial { get; set; }
        }

        public class Person
        {
            public NameComponent Name { get; set; }
        }

        public class PersonDTO
        {
            public string FirstName { get; set; }
            public string MiddleInitial { get; set; }
            public string LastName { get; set; }
        }
}

Но преждеЯ копаю пример кода, кто-нибудь знает, работает ли ValueInjecter в веб-среде Medium-Trust?(Как Godaddy?)

он не использует рефлексию.emit, поэтому он должен работать

...