值注入器问题
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】:基本思想是我将Name
与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 在中等信任网络中工作 环境? (像 Godaddy 一样?)
它不使用反射。发射所以它应该工作
【讨论】:
我迫不及待想试试这个!感谢您的答复。查看解决方案让我想到另一个问题。我看到为了从 Person -> PersonDTO 映射需要这样的东西。 var pp = new Person(); pp.InjectFrom(dto); pp.InjectFromvar injecter = new ValueInjecter(); injecter.Define<Person,PersonDTO>( (person,dto,injecter) => injecter.Inject(dto,person); injecter.Inject(Inject<ToNameComponent>(dto, person); );
的东西,然后在使用中就是这样... pp.InjectFrom(dto);
@NYCChris :) 不,那是自动映射器,但您可以创建自己的映射器类并在那里放置您需要的任何注入
是的...在我放弃 automapper 后,我开始自己编写,直到找到 ValueInjecter。我可以重用我写的一些东西来创建我定义的注入想法。 顺便说一句:您的代码有效!谢谢!以上是关于值注入器问题的主要内容,如果未能解决你的问题,请参考以下文章