如何使用ValueInjector映射列表

Bre*_*ogt 25 asp.net asp.net-mvc asp.net-mvc-3 valueinjecter

我在用ASP.NET MVC 3.

有人可以帮我澄清这里发生的事情:

var person = new PersonRepository().Get();

var personViewModel = new PersonViewModel();
personViewModel.InjectFrom<LoopValueInjection>(person)
     .InjectFrom<CountryToLookup>(person);
Run Code Online (Sandbox Code Playgroud)

我的Index观点有一个网格.每行都是一个实例CategoryViewModel.所以我所做的是获取所有类别的列表,然后将每个Category类别映射到CategoryViewModel,然后将此ListViewModel列表传递给视图.我会做那样的映射吗?

IEnumerable<Category> categoryList = categoryService.GetAll();
Run Code Online (Sandbox Code Playgroud)

我认为以下内容可行,但事实并非如此:

// Mapping
IList<CategoryViewModel> viewModelList = new List<CategoryViewModel>();
viewModelList.InjectFrom(categoryList);
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 46

AFAIK值injecter不支持AutoMapper之类的自动集合映射,但您可以使用简单的LINQ表达式并对每个元素进行操作:

IEnumerable<Category> categoryList = categoryService.GetAll();
IList<CategoryViewModel> viewModelList = categoryList
    .Select(x => new CategoryViewModel().InjectFrom(x)).Cast<CategoryViewModel>()
    .ToList();
Run Code Online (Sandbox Code Playgroud)

  • @BrendanVogt我在Darin的答案中添加了Cast <T>,现在试试 (3认同)

jga*_*fin 24

//source list
IEnumerable<string> items = new string[] { "1", "2" };

// target list
List<int> converted = new List<int>();

// inject all
converted.InjectFrom(items);
Run Code Online (Sandbox Code Playgroud)

和扩展方法:

public static ICollection<TTo> InjectFrom<TFrom, TTo>(this ICollection<TTo> to, IEnumerable<TFrom> from) where TTo : new()
{
    foreach (var source in from)
    {
        var target = new TTo();
        target.InjectFrom(source);
        to.Add(target);
    }
    return to;
}
Run Code Online (Sandbox Code Playgroud)

ICollection<T>是获得最少功能但是Add方法的接口.

更新

使用更合适的模型的示例:

var persons = new PersonRepository().GetAll();
var personViewModels = new List<PersonViewModel>();
personViewModels.InjectFrom(persons);
Run Code Online (Sandbox Code Playgroud)

更新 - 从不同来源注入

public static ICollection<TTo> InjectFrom<TFrom, TTo>(this ICollection<TTo> to, params IEnumerable<TFrom>[] sources) where TTo : new()
{
    foreach (var from in sources)
    {
        foreach (var source in from)
        {
            var target = new TTo();
            target.InjectFrom(source);
            to.Add(target);
        }
    }
    return to;
}
Run Code Online (Sandbox Code Playgroud)

用法:

var activeUsers = new PersonRepository().GetActive();
var lockedUsers = new PersonRepository().GetLocked();
var personViewModels = new List<PersonViewModel>();

personViewModels.InjectFrom(activeUsers, lockedUsers);
Run Code Online (Sandbox Code Playgroud)