Ich verwende Request/Response-Muster auf einer Service-Schicht. Ich habe zum Beispiel:Antwort-/Anfrage-Muster ... Wie gestalten Sie die DTOs?
public class FindPostsByTypeRequest : Request {
public PostType Type { get; set; }
}
public class FindPostsByTypeResponse : Response {
public IList<PostDto> Posts { get; set; }
public class PostDto {
public Int32 Id { get; set; }
public String Title { get; set; }
public String Text { get; set; }
}
}
Um diese Anfrage zu behandeln Ich habe einen Handler:
public class FindPostsByTypeHandler : Handler<FindPostsByTypeRequest, FindPostsByTypeResponse> {
private IContext _context;
public FindPostsByTypeHandler(IContext context) {
_context = context;
}
public FindPostsByTypeResponse Handle(FindPostsByTypeRequest request) {
IList<FindPostsByTypeRequest.PostDto> posts = _context.Posts
.Where(x => x.Type == request.Type)
.Select(x => new FindPostsByTypeRequest.PostDto {
Id = x.Id,
Title = x.Title,
Text = x.Text
}).ToList();
return new FindPostsByTypeResponse { Posts = posts };
}
}
Dann habe ich einen Dispatcher und verwenden Sie es wie folgt:
FindPostsByTypeRequest request = new FindPostsByTypeRequest { Type = type };
FindPostsByTypeResponse response = _dispatcher.Send<FindPostsByTypeResponse>(request);
Das Problem Ich versuche zu lösen:
Wenn ich nach Posts nach Typ s suchen Manchmal brauche ich die Tags ... Manchmal nicht. Natürlich konnte ich immer die Tags in meine DTOs bekommen und es verwenden oder nicht ... Aber etwas Laden, den ich vermeiden ...
Also nicht benötigen, solltenim Grunde muss ich die Beiträge von Typ erhalten und "Sagen" Sie dem Handler, welche Daten ich brauche.
_dispatcher.Send<FindPostsByTypeResponse<PostWithTagsModel>>(request);
Wo PostWithTagsModel die DTO ich brauchen würde wäre:
würde meine Idee, etwas Ähnliches sein. Da ist in meinem Handler hätte ich:
public class FindPostsByTypeHandler : Handler<FindPostsByTypeRequest, FindPostsByTypeResponse> {
private IContext _context;
public FindPostsByTypeHandler(IContext context) {
_context = context;
}
public FindPostsByTypeResponse<PostsByType> Handle(FindPostsByTypeRequest request) {
IList<FindPostsByTypeResponse.PostDto> posts = _context.Posts
.Where(x => x.Type == request.Type)
.Select(x => new FindPostsByTypeResponse.PostDto {
Id = x.Id,
Title = x.Title,
Text = x.Text
}).ToList();
return new FindPostsByTypeResponse { Posts = posts };
}
public FindPostsByTypeResponse<PostsWithoutTagsDto> Handle(FindPostsByTypeRequest request) {
IList<FindPostsByTypeResponse.PostsWithoutTagsDto> posts = _context.Posts
.Where(x => x.Type == request.Type)
.Select(x => new FindPostsByTypeResponse.PostsWithoutTagsDto {
Id = x.Id,
Title = x.Title,
Text = x.Text
}).ToList();
return new FindPostsByTypeResponse { Posts = posts };
}
public FindPostsByTypeResponse<PostsWithTagsDto> Handle(FindPostsByTypeRequest request) {
// Remaining code
}
}
Ich bin nicht sicher, dies ist möglich oder sogar der beste Weg, dies zu tun ...
Grundsätzlich muß ich „sagen,“ der Handler, in welchem Format I brauche die DTOs, die in der Antwort enthalten sind.
Wie kann oder soll ich das tun?
Nicht wirklich. Ich brauche etwas allgemeineres und ich muss in die Anfrage eingehen, welchen Typ ich will. Wie würdest du den Dispatcher an deinem Beispiel benutzen? –
Seitennotiz ... Ich habe noch nie so eine verrückte Formatierung gesehen – AlexFoxGill
Die Formatierung ist nützlich, wenn man die Methoden betrachtet, wenn sie mit ctrl M-O kollabiert sind. Die Idee ist, eine Methode auf einmal statt mehrerer gleichzeitig zu betrachten. Grundsätzlich ist der erste Tabstop die Modifikatorspalte, der zweite ist die Typ-/Rückgabetypspalte, der dritte ist der Name der Eigenschaft/des Feldes/der Methode, und der vierte optionale ist die Feldinitialisierung oder property {get; einstellen;}. –