2015-05-19 3 views
9

Ich bin gerade am Anfang der Entwicklung einer großen Webanwendung, die hauptsächlich eine Angular SPA und eine OData WebAPI enthält, die Zugriff auf eine Backend-Schicht hat.
Wir befinden uns in einem frühen Stadium und haben damit begonnen, die ersten Klassen einschließlich Model.dll zu implementieren, die sich in einem gemeinsamen Namespace befinden, sodass alle Ebenen darauf zugreifen können.
Wir diskutieren jetzt über diese DTOs innerhalb des Modells. Einige sagen, dass Schnittstellen unbedingt erforderlich ist, so dass der Code so sein würde:Schnittstellen für DTOs

namespace MySolution.Common.Model 
{ 
    public interface IPerson 
    { 
     int Id { get; set; } 
     string Name { get; set; } 
     ... 
    } 
} 

namespace MySolution.Common.Model 
{ 
    public class PersonDTO : IPerson 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
     ... 
    } 
} 

So ist es das ist. Einfach einfache DTOs ohne weitere Intelligenz.
Ich frage mich jetzt, ob das wirklich ein guter Ansatz ist, denn ich sehe hier nicht die Notwendigkeit, die Schnittstelle zu benutzen.
Was sind die Vorteile? Testbarkeit wurde erwähnt, aber ist es sogar notwendig, DTos zu testen? Dependency Injection sollte auch nicht der Punkt sein.
Jede Aufklärung wäre sehr hilfreich. Am Ende ist das Lernen neuer Dinge und Ansätze immer gut ...

+0

Es gibt keinen Grund, eine Schnittstelle zu verwenden, wenn Sie sie nicht benötigen. Dies ist zu kompliziert, was ein einfaches Objekt sein sollte. –

+1

Wenn das * DTO * einfach eine Liste von Eigenschaften ist, sehe ich das sinnlos. Wenn Sie über eine Art Repository verfügten, würden Sie diese Schnittstelle verwenden, um beispielsweise eine DB-Verbindung für eine gefälschte Repräsentation zu ersetzen. Wenn Sie 'Person GetPerson()' hätten, könnten Sie die DB-Version und die Fake-Version haben. – christiandev

+0

Sie könnten eine Marker-Schnittstelle auf einem DTO ('FooDto: IAmADto') für Typ-Constraints und Mappings öffnen, aber sonst, welchen Zweck erfüllt es? Es gibt keine Abstraktion hier, abhängig von 'IPerson 'gibt Ihnen genau das gleiche Maß an Kopplung als abhängig von' Person'. –

Antwort

3

DTOs Übertragungsstatus - das ist es. Sie über einen Container zu injizieren oder zu testen, erscheint sinnlos (wenn das die Motivation ist) und völlig unnötig. Tu es nicht.

2

Als Beispiel weiter auf meinen Kommentar oben:

Interface IRepo 
{ 
    Person GetPerson(int id); 
} 

Public class DbRepo : IRepo 
{ 
    public Person GetPerson(int id){//get person from database} 
} 

Public class FakeRepo : IRepo 
{ 
    public Person GetPerson(int id) 
    { 
    return new Person {Id = id, Name = "TestName"}; 
    } 
} 

Sie würden eine FakeRepo mit einigen Mock-Objekte verwenden für Testzwecke.

+0

Ich würde es verstehen, die Schnittstelle für diesen Fall zu verwenden. In meinem Fall bekomme ich Objekte von einem anderen Dienst, der zu jeder Zeit eine Datenbank sein kann, und mappe diese Objekte mit Hilfe von 'Automapper 'auf mein DTos. –

+0

Wie ich im obigen Kommentar erwähnt habe, ist es sinnlos, eine Schnittstelle für ein einfaches DTO zu haben. – christiandev

Verwandte Themen