2015-05-19 18 views
9

Şu anda ağırlıklı olarak bir Angular SPA ve bir arka uç katmanına erişimi olan bir OData WebAPI içeren büyük bir web uygulaması geliştirmenin başlangıcındayım.
Erken bir aşamadayız ve tüm katmanların erişebilmesi için ortak bir ad alanında bulunan Model.dll dahil olmak üzere ilk sınıfları uygulamaya başladık.
Şimdi modeldeki bu DTO'lar hakkında görüşüyoruz. Bazıları arayüzleri kullanmanın kesinlikle gerekli olduğunu söylüyor, bu yüzden kod şöyle olurdu:DTO'lar için Arayüzler

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; } 
     ... 
    } 
} 

İşte bu kadar. Artık zekaya sahip olmayan sadece basit DTO'lar.
Şimdi bu gerçekten iyi bir yaklaşım olup olmadığını kendime soruyorum, çünkü burada arayüzü kullanmanın gerekliliğini görmüyorum.
Bunun avantajları nelerdir? Test edilebilirlik söz konusuydu, ancak DTos'u test etmek bile gerekli mi? Bağımlılık Enjeksiyon da nokta olmamalıdır.
Herhangi bir aydınlanma çok yardımcı olabilir. Sonunda yeni şeyler öğrenmek ve yaklaşımlar her zaman iyidir ...

+0

İhtiyacınız yoksa bir arayüz kullanmanın bir nedeni yok. Bu basit bir nesne olması gereken şeyleri fazlasıyla karıştırıyor. –

+1

* DTO * basit bir özellik listesi ise, bunu anlamsız görüyorum. Bir çeşit deponuz varsa, örneğin, sahte bir temsil için bir DB bağlantısını değiştirmek için bunu yaparsınız. Eğer kişi GetPerson() 'a sahip olsaydınız, DB versiyonuna ve Sahte versiyona sahip olabilirsiniz. – christiandev

+0

Tip kısıtlamaları ve eşleştirmeler için bir DTO ('FooDto: IAmADto') üzerinde bir işaretçi arabirimi açabilirsiniz, ancak aksi halde, hangi amaçla sunuluyor? IPersona bağlı olarak burada hiçbir soyutlama yoktur, 'Kişiye' bağlı olarak aynı düzeyde bir kuplaj sağlar. –

cevap

3

DTO'lar transfer durumu - işte bu kadar. Onları bir konteynırla enjekte etmek ya da test etmek için onları alay etmek anlamsızdır (eğer bu motivasyonsa) ve tamamen gereksizdir. Yapma.

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"}; 
    } 
} 

Sen test amaçlı bazı sahte nesneler ile FakeRepo kullanırsınız: Yukarıdaki benim yorum ayrıca örnek olarak

2

.

+0

Bu durum için arabirimi kullanmasını anlarım. Benim durumumda, her zaman bir veritabanı olabilecek başka bir hizmetten nesneler alıyorum ve bu nesneyi 'Automapper' kullanarak DTos'uma eşleştiriyorum. –

+0

Yukarıdaki yorumda da belirtildiği gibi, basit bir DTO için bir arayüze sahip olmak anlamsız. – christiandev