Я играю с valueinjecter и задаюсь вопросом, как мне сделать view-модели для доменов, когда модель представления имеет коллекцию view-моделей?
Скажите, у меня есть этот домен
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, иначе он никогда не попадет в мой переопределенный метод.