viewcomponent taghelper tag net mvc asp asp.net asp.net-mvc asp.net-mvc-3 valueinjecter

asp.net - taghelper - Cómo mapear listas con ValueInjector



tag helpers asp net core (4)

Estoy usando ASP.NET MVC 3 .

¿Puede alguien ayudarme a aclarar qué está pasando aquí?

var person = new PersonRepository().Get(); var personViewModel = new PersonViewModel(); personViewModel.InjectFrom<LoopValueInjection>(person) .InjectFrom<CountryToLookup>(person);

Tengo una cuadrícula en mi vista de Index . Cada fila es una instancia de un CategoryViewModel . Entonces, lo que hago es obtener una lista de todas las categorías y luego asignar cada Category a un CategoryViewModel, y luego pasar esta lista de CategoryViewModels a la vista. ¿Me gustaría hacer un mapeo como ese?

IEnumerable<Category> categoryList = categoryService.GetAll();

Pensé que lo siguiente funcionaría pero no lo hace:

// Mapping IList<CategoryViewModel> viewModelList = new List<CategoryViewModel>(); viewModelList.InjectFrom(categoryList);


El inyector de valor AFAIK no admite la asignación automática de colecciones como AutoMapper, pero podría usar una expresión LINQ simple y operar en cada elemento:

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


Para los que, como yo, prefieren las anotaciones más cortas.

public static ICollection<TTarget> InjectFromList<TTarget, TOrig>(this ICollection<TTarget> target, ICollection<TOrig> source) where TTarget : new() { source.Select(r => new TTarget().InjectFrom(r)) .Cast<TTarget>().ToList().ForEach(e => target.Add(e)); return target; } public static ICollection<TTarget> InjectFromList<TTarget, TOrig>(this ICollection<TTarget> target, params ICollection<TOrig>[] sources) where TTarget : new() { sources.ToList().ForEach(s => s.ToList().Select(r => new TTarget().InjectFrom(r)) .Cast<TTarget>().ToList().ForEach(e => target.Add(e))); return target; }


Usar esta definicion de funcion

public static object InjectCompleteFrom(this object target, object source) { if (target.GetType().IsGenericType && target.GetType().GetGenericTypeDefinition() != null && target.GetType().GetGenericTypeDefinition().GetInterfaces() != null && target.GetType().GetGenericTypeDefinition().GetInterfaces() .Contains(typeof(IEnumerable)) && source.GetType().IsGenericType && source.GetType().GetGenericTypeDefinition() != null && source.GetType().GetGenericTypeDefinition().GetInterfaces() != null && source.GetType().GetGenericTypeDefinition().GetInterfaces() .Contains(typeof(IEnumerable))) { var t = target.GetType().GetGenericArguments()[0]; var tlist = typeof(List<>).MakeGenericType(t); var addMethod = tlist.GetMethod("Add"); foreach (var sourceItem in source as IEnumerable) { var e = Activator.CreateInstance(t).InjectFrom<CloneInjection>(sourceItem); addMethod.Invoke(target, new[] { e }); } return target; } else { return target.InjectFrom(source); } }


//source list IEnumerable<string> items = new string[] { "1", "2" }; // target list List<int> converted = new List<int>(); // inject all converted.InjectFrom(items);

Y el método de extensión:

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; }

ICollection<T> es la interfaz que tiene menos funciones pero un método Add .

Actualizar

Un ejemplo utilizando modelos más apropiados:

var persons = new PersonRepository().GetAll(); var personViewModels = new List<PersonViewModel>(); personViewModels.InjectFrom(persons);

Actualización - Inyectar desde diferentes fuentes.

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; }

Uso:

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