首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ValueInjecter问题

ValueInjecter问题
EN

Stack Overflow用户
提问于 2011-03-03 12:24:22
回答 1查看 842关注 0票数 3

在使用AutoMapper之后,我在这个网站上偶然发现了ValueInjecter。我正在尝试它,但我被一个可能非常简单的场景卡住了。

但是在我深入研究代码示例之前,有没有人知道ValueInjecter是否可以在中等信任的web环境中工作?(就像Godaddy?)

好了,开始写代码吧!我有以下模型:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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映射到模型时,我需要FirstName -> Name.First。据我所知,这不是一个简单的展平/取消展平,因为单词本身也会颠倒过来,即: FirstName <--> Name.First。所以名字和姓氏可以使用相同的规则,但是MiddleInitial呢?Model.Name.MiddleInitial -> DTO.MiddleInitial.

我看到有一些插件,但它们似乎没有一个能做我想要的。还有没有人遇到过这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-03 15:47:23

基本思想是将NameFirstName进行匹配,并将其作为轴心点,在通常将值设置为一个(FirstName)属性的方法中,我将其设置为3个属性-这是用于FromNameComp的属性

ToNameComp中,我匹配相同的属性,但我从3中取值,创建一个并设置它

代码语言:javascript
复制
    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是否可以在中等信任的web环境中工作?(就像Godaddy?)

它不使用reflection.emit,所以它应该可以工作

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5176629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档