Ich habe gerade angefangen, View & Domain-Modell-Design in meiner MVC-Web-App, aber habe die Frage, wo Berechnungen und andere View-bezogene Aktionen durchführen. Ich werde versuchen, ein Beispiel zu geben.Ansicht und Domain-Modell, wo die Berechnung durchgeführt wird
My Domain Model (Linq2Sql)
public class Product
{
public int Id;
public string Name;
}
The View Modell mit neuer UserCount
Eigenschaft, die Ich mag würde berechnen.
public class ProductViewModel
{
public int Id;
public string Name;
public int UserCount;
}
Mein Controller-Aktion sieht aus wie
public ActionResult _SelectionClientSide_Products()
{
IQueryable<Product> products = _repository.GetProducts(true);
var model = Mapper.Map<IEnumerable<Product>, IEnumerable<ProductViewModel>>(products);
return View(model);
}
ich nach Daten abfragen Repository-Methode und bekommen IQueryable<Product>
und wo es zu ProductViewModel
Liste. Aber ich muss auch einen anderen Abfragevorgang durchführen, um Benutzer für jedes abgefragte Produkt zu zählen und alle Werte ProductViewModel zuzuordnen. Welchen Entwurf sollte ich befolgen, um dies zu erreichen?
Die Beziehung zwischen Tabellen
Products -> Orders - > Users
EDIT
ich mich entschlossen habe AutoMapper zu entfernen, weil es mehr Probleme als Vorteile gibt und meine eigene Builder, die alles enthalten, was ich brauche. Ich mache Feld zuweisen und auch Berechnung hinzufügen.
public ActionResult _SelectionClientSide_Products()
{
Data = new ProductViewModelBuilder(_repository).Build();
return View(Data);
}
namespace PC.Models
{
public class ProductViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public int UsersCount { get; set; }
}
public class ProductViewModelBuilder
{
private readonly IDataAccess _repository;
public ProductViewModelBuilder(IDataAccess repository)
{
_repository = repository;
}
public IQueryable<ProductViewModel> Build()
{
return _repository.GetProducts().Select(p=> new ProductViewModel
{
Id = p.Id,
Name = p.Name,
UsersCount = _repository.CountUsers(p.Id)
});
}
}
}
Ich habe gelesen, dass es schlechte Praxis ist, zusätzliche Felder im Domänenmodell zu erstellen, wenn diese Felder nur einmal in einem View-Modell benötigt werden. Wenn Ihre Beispielrepository _repository.GetProductsAndUserCount-Methode das Domänenmodell zurückgibt (nicht sicher, aber so scheint es), ist das Feld UserCount jedoch standardmäßig nicht vorhanden.Also schlagen Sie vor, Calculate Field im Domain Model zu erstellen (ich benutze linq2sql und würde diese Case Domain partielle Klasse erweitern)? Aber wie gesagt, ich habe gelesen, dass das nicht praktikabel ist. – Tomas
@Tomas - es ist ein DTO. Zweck ist also, ein oder mehrere Domänenobjekte zu umbrechen, damit sie im App-Stapel übertragen werden können. Wie ist diese schlechte Praxis? Ihr ProductViewModelBuilder ist eine schlechte Vorgehensweise. – RPM1984
Ich benutze Linq2SQL und mein DTO ist automatisch generierte Klassen von Linq2Sql Builder. Die Produkt (DTO) -Klasse hat keine UserCount-Eigenschaft, ich kann sie mit der Partial-Klasse erweitern, aber sie ist nicht rational, weil die gleiche Produktklasse an anderer Stelle verwendet wird. Also sollte ich eine andere DTO-Klasse ähnlich Product DTO von Linq2Sql generiert erstellen und UserCount-Eigenschaft hinzufügen und dann var someDto = _productRepository.Find(). WithSomeCondition (true) .ToSomeDto(); – Tomas