Sto utilizzando il modello di richiesta/risposta su un livello di servizio. Ho, per esempio:Modello risposta/richiesta ... Come modellare i DTO?
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; }
}
}
Per gestire questa richiesta ho un gestore:
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 };
}
}
Poi ho un dispatcher e lo uso come segue:
FindPostsByTypeRequest request = new FindPostsByTypeRequest { Type = type };
FindPostsByTypeResponse response = _dispatcher.Send<FindPostsByTypeResponse>(request);
Il Problema Sto cercando di risolvere:
Quando cerco messaggi per tipo s a volte ho bisogno dei tag ... A volte no. Naturalmente potrei sempre ottenere i tag nei miei DTOs e usarlo o no ... Ma caricare qualcosa che non ho bisogno deve essere evitato ...
Quindi, in pratica ho bisogno di ottenere i messaggi di tipo e "dire" al gestore di quali dati ho bisogno.
La mia idea sarebbe qualcosa di simile:
_dispatcher.Send<FindPostsByTypeResponse<PostWithTagsModel>>(request);
Dove PostWithTagsModel sarebbe il DTO avrei bisogno. Poi nella mia Handler avrei:
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
}
}
io non sono sicuro che questo è possibile, o anche il modo migliore per farlo ...
Fondamentalmente ho bisogno di "raccontare" il gestore in quale formato ho bisogno dei DTO inclusi nella risposta.
Come posso o dovrei farlo?
Non proprio. Ho bisogno di qualcosa di più generico e ho bisogno di passare alla richiesta che tipo voglio. Come useresti il dispatchher sul tuo esempio? –
nota a margine ... Non ho mai visto una formattazione così pazzesca – AlexFoxGill
La formattazione è utile quando si osservano i metodi quando vengono compressi usando ctrl M-O. L'idea è di guardare un metodo alla volta invece che diversi contemporaneamente. Fondamentalmente il primo tab stop è la colonna del modificatore, il secondo è il tipo/la colonna del tipo di ritorno, il terzo è il nome della proprietà/campo/metodo e il quarto facoltativo sarebbe l'inizializzazione del campo o la proprietà {get; impostato;}. –