1

私はvalueinjecterで遊んでいて、ビューモデルにビューモデルのコレクションがある場合にドメインに対してビューモデルをどのように行うのか疑問に思っていますか?

私がこのドメインを持っていると言う

   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であることを指定する必要があります。そうしないと、オーバーライドされたメソッドに入らないように見えます。

4

2 に答える 2

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);
    // ...
}
于 2011-12-20T20:11:09.717 に答える
1

すばやく簡単な方法の1つは、これを行うことです。

MyDomain.MyOtherDomains =
vm.MyOtherDomains.Select(o => new MyOtherDomain().InjectFrom(o))
.Cast<MyOtherDomain>();

編集: 私はあなたがダウンロードできる新しいテストプロジェクトを行いました(それはあなたのクラスも使用します)。ここで入手してください:http://valueinjecter.codeplex.com/releases/view/60311#DownloadId=318259

于 2011-12-21T17:13:04.490 に答える