值注入器问题

Posted

技术标签:

【中文标题】值注入器问题【英文标题】:ValueInjecter question 【发布时间】:2011-07-07 19:00:16 【问题描述】:

在使用 AutoMapper 之后,我在这个网站上遇到了 ValueInjecter。我正在尝试,但我被困在一个可能非常简单的场景上。

但在我深入研究代码示例之前,有谁知道 ValueInjecter 是否可以在中等信任网络环境中工作? (像 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 转到模型时,我需要 FirstName -> Name.First。据我了解,这不是一个简单的 Flatten/UnFlatten,因为这些词也会自行反转,即:FirstName Name.First。所以名字和姓氏可以使用相同的规则,但是 MiddleInitial 呢? Model.Name.MiddleInitial -> DTO.MiddleInitial.

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

【问题讨论】:

【参考方案1】:

基本思想是我将NameFirstName 匹配,我以此为轴心点,在通常将值设置为一个(名字)属性的方法中,我将其设置为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 在中等信任网络中工作 环境? (像 Godaddy 一样?)

它不使用反射。发射所以它应该工作

【讨论】:

我迫不及待想试试这个!感谢您的答复。查看解决方案让我想到另一个问题。我看到为了从 Person -> PersonDTO 映射需要这样的东西。 var pp = new Person(); pp.InjectFrom(dto); pp.InjectFrom(dto);是否有任何设施可以让我设置地图以在启动时注册此类内容? 类似var injecter = new ValueInjecter(); injecter.Define&lt;Person,PersonDTO&gt;( (person,dto,injecter) =&gt; injecter.Inject(dto,person); injecter.Inject(Inject&lt;ToNameComponent&gt;(dto, person); ); 的东西,然后在使用中就是这样... pp.InjectFrom(dto); @NYCChris :) 不,那是自动映射器,但您可以创建自己的映射器类并在那里放置您需要的任何注入 是的...在我放弃 automapper 后,我开始自己编写,直到找到 ValueInjecter。我可以重用我写的一些东西来创建我定义的注入想法。 顺便说一句:您的代码有效!谢谢!

以上是关于值注入器问题的主要内容,如果未能解决你的问题,请参考以下文章

如何将null值传递给简单注入器中的构造函数?

AngularJS注入器问题

预处理器指令反射注入

AngularJS 注入器:modulerr

C# Dll 注入器、VB.Net Dll 注入器

开源dll注入器