Mit DTO zur übertragung von Daten zwischen service layer und UI-Schicht
Ich habe versucht, dies herauszufinden, für Tage, aber es scheint sehr wenig Informationen zu diesem bestimmten Thema mit ASP.NET MVC. Ich habe schon Googeln, um für Tage und noch nicht wirklich in der Lage, Figur etwas mehr über dieses Thema.
Habe ich einen 3-Schicht-Projekt. Business, DAL und UI/Web-Schicht. In der DAL ist dbcontext, repository und unit of work. In der business-Schicht ist eine domain layer mit allen Schnittstellen und die EF-Modelle. In der business-Schicht, dort ist auch eine service-Schicht mit DTOs für die EF-Modelle und eine generische repository-Dienst für den Zugriff auf das repository. Diese Bild sollte helfen, es zu erklären.
Mein problem ist, ich kann einfach nicht scheinen, um herauszufinden, wie man die DTOs übertragen Sie Daten aus der business-Schicht.
Habe ich erstellt-service-Klassen für die DTOs. Ich habe eine ImageDTO und Modell und dasselbe gilt für Bild-Anker. Ich habe eine service-Klasse für jedes DTO. Also ich habe da ein image-service-und anchor-service. Diese Dienste übernehmen die repository-service und im moment der Umsetzung Ihrer eigenen Leistungen. Aber das ist ungefähr so weit wie ich bekommen haben. Denn diese Dienste haben Konstruktoren, die einen IUnitOfWork-Schnittstelle über IoC habe ich ziemlich viel abbekommen gestrandet.
Wenn ich mich auf den service direkt aus der Benutzeroberfläche funktioniert alles wie es soll aber ich kann einfach nicht meinen Verstand um, wie die Verwendung von DTOs zur übertragung von Daten sowohl von der service-Schicht auf der UI-Ebene und Umgekehrt.
Mein service-layer:
Business/Services/DTOs
public class AnchorDto
{
public int Id { get; set; }
public int x1 { get; set; }
public int y1 { get; set; }
public int x2 { get; set; }
public int y2 { get; set; }
public string description { get; set; }
public int imageId { get; set; }
public int targetImageId { get; set; }
public AnchorDto(int Id, int x1, int y1, int x2, int y2, string description, int imageId, int targetImageId)
{
//Just mapping input to the DTO
}
}
public class ImageDto
{
public int Id { get; set; }
public string name { get; set; }
public string title { get; set; }
public string description { get; set; }
public virtual IList<AnchorDto> anchors { get; set; }
public ImageDto(int Id, string name, string title, string description, IList<AnchorDto> anchors )
{
//Just mapping input to DTO
}
}
Business/Services/Services
public class RepoService<TEntity> : IRepoService<TEntity> where TEntity : class
{
private IRepository<TEntity> repo;
public RepoService(IUnitOfWork repo)
{
this.repo = repo.GetRepository<TEntity>();
}
public IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "")
{
return repo.Get(filter, orderBy, includeProperties);
}
public TEntity GetByID(object id)
{
return repo.GetByID(id);
}
public void Insert(TEntity entity)
{
repo.Insert(entity);
}
public void Delete(object id)
{
repo.Delete(id);
}
public void Delete(TEntity entityToDelete)
{
repo.Delete(entityToDelete);
}
public void Update(TEntity entityToUpdate)
{
repo.Update(entityToUpdate);
}
}
Den Image-Service, der IImageService-Schnittstelle ist zur Zeit leer, bis ich herausfinden, was ich implementieren muss.
public class ImageService : RepoService<ImageModel>, IImageService
{
public ImageService(IUnitOfWork repo)
: base(repo)
{
}
}
Im moment mein Controller nicht wirklich arbeiten und nicht mit den service-layer, so dass ich beschlossen, nicht zu einem von denen. Ich Plane, die Karte von DTOs auf ViewModels mit auto-mapper habe ich einmal sortiert das Problem aus.
So, jetzt bitte jemand kompetent genug, um mir diese Idee fehlt mir, so kann ich dies herausfinden?
InformationsquelleAutor grimurd | 2013-05-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihren Dienst erhalten sollten, DTOs, Zuordnung zu Geschäftseinheiten und senden Sie diese an das repository. Es sollte auch das abrufen von business-Entitäten aus dem repository anzeigen Sie DTOs und die Rückgabe der DTOs als reponses. So Ihr business-Entitäten, die nie aus der business-Schicht, nur die DTOs tun.
Dann Ihre UI\Weblayer sollte bewusst sein, das Unternehmen. Die web-Schicht sollte nur wissen über die DTOs. Zur Durchsetzung dieser Regel ist sehr wichtig, dass auf der UI-Ebene nicht verwendet die service-Implementierung Klassen (privat), nur die Schnittstellen. Und die service-Schnittstellen sollte nicht davon abhängen, die business-Einrichtungen, nur die DTOs.
Also müssen Sie service-Schnittstellen basiert auf DTOs, und Ihre Basis-service-Klasse muss ein weiteres generisches argument für die DTO. Ich mag, um eine Basis-Klasse für die Personen und die DTOs, so dass Sie können deklariert werden als:
Müssen Sie dann einen Weg der addition der Zuordnung zwischen Entitäten und DTO an, dass Basis-service ohne tatsächlich die Implementierung der Zuordnung (wie es hängt von jeder konkreten Person und DTO-Klassen). Sie könnte erklären, abstrakten Methoden, die die Zuordnung durchzuführen und müssen implementiert werden, die auf jeden spezifischen Dienst (wie
ImageService
). Die Durchführung des Basis-RepoService würde wie folgt Aussehen:Oder Sie könnten erklären, mapping services, das hinzufügen einer Abhängigkeit mit einem appropiated mapping-Dienst bereitgestellt werden sollten, von Ihren IOC (Das macht mehr Sinn, wenn Sie brauchen die gleiche Zuordnung auf verschiedene Dienste). Die Umsetzung der RepoService würde wie folgt Aussehen:
In beiden Fällen (abstract-Methoden oder-mapping-services) implementieren Sie die Zuordnung zwischen den Entitäten und DTOs manuell oder mit einem tool wie Automapper. Aber Sie sollten sehr vorsichtig sein bei der Verwendung der AutoMapper und entity framework, aber das ist ein anderes Thema! (Google ein bisschen über, und sammeln Sie einige Informationen zum Thema. Als erste Rat, achten Sie auf die Abfragen werden auf der Datenbank ausgeführt, wenn das laden von Daten, so dass Sie nicht laden Sie es mehr als notwendig, oder senden viele Anfragen. Beim speichern von Daten darauf achten, Ihre Sammlungen und Beziehungen)
Lange post vielleicht, aber ich hoffe, es hilft!
Wenn Sie nicht enthalten keine Logik, dann wären Sie Schnittstellen. Aber in der Regel haben Sie gemeinsame Eigenschaften, wie die Id, so dass Sie dann sind abstrakte Klassen mit dem gemeinsamen Eigentum. Die
DTOBase
befindet sich in der service-Schicht und dieEntityBase
in der business-Schicht.Ich sehe, vielen Dank für deine Hilfe, das hat mir wirklich geholfen aus 🙂
Froh zu hören, dass!
InformationsquelleAutor Daniel J.G.