我正在使用valueinjecter并想知道当视图模型有一组viewmodel时我如何对域进行视图模型?
说我有这个域名
public class MyDomain
{
public IList<MyOtherDomain> MyOtherDomains {get; set;}
}
public class MyOtherDomain
{
public string Name {get; set;}
}
public class MyMasterVM
{
public IList<MyOtherVm> MyOtherDomains {get; set;}
}
public class MyOtherVm
{
public string Name {get; set;}
}
现在我该如何进行注射?我是否需要使用valueinjector手动映射这些?
public ActionResult Method(MyMasterVM vm)
{
MyDomain d = new MyDomain();
d.InjectFrom<UnflatLoopValueInjection>(vm);
}
修改
经过一些游戏,我让模拟器工作。然而,我的不同于测试中的那个
// sample test
public class FooBar : TypeMapper<Foo, Bar>
{
public override Bar Map(Foo source, Bar target)
{
base.Map(source, target);
target.NoConvention = source.Name + source.Xyz + source.Props;
return target;
}
}
[Test]
public void MapShouldMapCollectionPropertiesAndUseFooBarTypeMapper()
{
MapperFactory.AddMapper(new FooBar());
var foo = new Foo
{
Foos = new List<Foo>
{
new Foo{Name = "f1",Props = "v",Xyz = 19},
new Foo{Name = "f2",Props = "i",Xyz = 7},
new Foo{Name = "f3",Props = "v",Xyz = 3},
}
};
var bar = Mapper.Map<Foo, Bar>(foo);
Assert.AreEqual(foo.Foos.Count(), bar.Foos.Count());
var ffoos = foo.Foos.ToArray();
var bfoos = bar.Foos.ToArray();
for (var i = 0; i < ffoos.Count(); i++)
{
Assert.AreEqual(ffoos[i].Name, bfoos[i].Name);
Assert.AreEqual(ffoos[i].Name + ffoos[i].Xyz + ffoos[i].Props, bfoos[i].NoConvention);
}
}
// mine
public class Test : TypeMapper<IList<MyOtherVm>, IList<MyOtherDomain>>
{
public override IList<MyOtherDomain> Map(IList<MyOtherVm> source, IList<MyOtherDomain> target)
{
// not sure if I always have to call base
// mapping would happen here.
return base.Map(source, target);
}
}
MapperFactory.AddMapper(new Test());
IList<MyOtherDomain> otherDomains= new List<MyOtherDomain>();
MapperVj.Map(vm.MyOtherDomains , otherDomains);
我必须指明它是一个IList,否则它似乎永远不会进入我的重写方法。
答案 0 :(得分:1)
我认为你需要实现自己的自定义IValueInjection
注入器。我也基于你MyDomain
班的错字来回答这个问题。
MyDomain.MyOtherDomains : IList<MyOtherDomains>
而不是
MyDomain.MyOtherDomains : IList<MyOtherVm>
因此,客户注入类看起来像这样(如果有更好的方法,则不是100%)
public class CustomInjecter : IValueInjection
{
public object Map(object source, object target)
{
MyDomain result = new MyDomain();
result.MyOtherDomains = new List<MyOtherDomain>();
foreach (MyOtherVm vm in (source as MyMasterVM).MyOtherVMs)
{
MyOtherDomain od = new MyOtherDomain();
// inject commonly named properties of each "child" VM
od.InjectFrom(vm);
result.MyOtherDomains.Add(od);
}
return result;
}
}
在您的控制器中,您几乎可以像上面指定的那样使用它(只需更改进样器类型)
public ActionResult Method(MyMasterVM vm)
{
MyDomain d = new MyDomain();
d.InjectFrom<CustomInjecter>(vm);
// ...
}
答案 1 :(得分:1)
一种快速简便的方法就是:
MyDomain.MyOtherDomains =
vm.MyOtherDomains.Select(o => new MyOtherDomain().InjectFrom(o))
.Cast<MyOtherDomain>();
修改强> 我做了一个你可以下载的新测试项目(它也使用你的类)。 得到它:http://valueinjecter.codeplex.com/releases/view/60311#DownloadId=318259