2011-02-02 17 views
6

Bir SOAP API'sı aracılığıyla dosyaları web tabanlı bir uygulamaya aktaracağım bir aracı prototip yapıyorum ve C# arabirimleri üzerinden ne tür veri aktarmaya çalıştığımı modelledim, böylece web uygulamasının model verilerini uğraşabileceğim bir şeye sardım.Etki alanı modellemesi - Özelliklerin veya POCO'nun arabirimini uygular mısınız?

public interface IBankAccount 
{ 
    string AccountNumber { get; set; } 
    ICurrency Currency { get; set; } 
    IEntity Entity { get; set; } 
    BankAccountType Type { get; set; } 
} 

internal class BankAccount 
{ 
    private readonly SomeExternalImplementation bankAccount; 

    BankAccount(SomeExternalImplementation bankAccount) 
    { 
     this.bankAccount = bankAccount; 
    } 

    // Property implementations 
} 

Sonra benim için BankAccounts onlara gerektiğinde oluşturmak için IBankAccount ya da her türlü ve bir fabrika sınıfının koleksiyonları döndüren bir depo var.

Sorum şu, bu yaklaşım bana çok fazla ağrıya neden olacak ve POCO'lar yaratmak daha mı iyi olacak? Tüm bunları ayrı bir mecraya koymak ve veri erişiminin ve iş mantığının tamamen ayrılmasını istiyorum, çünkü burada verilerin çevrimiçi olarak nerede saklanacağına dair hareketli bir hedefle uğraşıyorum.

cevap

3

Bu, tam olarak kullandığım yaklaşım ve hiç bir sorunla karşılaşmadım. Tasarımımda veri erişim katmanından çıkan her şey bir arayüz olarak soyutlandı (veri aktarım sözleşmeleri olarak adlandırıyorum).

public class CompositeEntity 
{ 
    static public CompositeEntity FromDataTransport(IFooData fooData, IBarData barData) 
    { 
     ... 
    } 
} 
: Alan modelinde Sonra

interface IFooData 
{ 
    int FooId { get; set; } 
} 

public class FooEntity 
{ 
    static public FooEntity FromDataTransport(IFooData data) 
    { 
     return new FooEntity(data.FooId, ...); 
    } 
} 

Ayrıca alan adı modeli kişiler birden çok veri sözleşmelerinden verilerini toplamak nerede oldukça kullanışlı .. bu veri taşıma nesnelerden iş nesneler yaratmak için statik yöntemleri var

Tasarımınızın aksine, veri aktarım sözleşmelerinin somut uygulamalarını oluşturmak için fabrikalar sağlamam, ancak değerleri yazmak ve depoları beton nesneler oluşturma konusunda endişelendirmek için delegeler sağlamadım

public class FooDataRepository 
{ 
    public IFooData Insert(Action<IFooData> insertSequence) 
    { 
     var record = new ConcreteFoo(); 

     insertSequence.Invoke(record as IFooData); 

     this.DataContext.Foos.InsertOnSubmit(record); // Assuming LinqSql in this case.. 

     return record as IFooData; 
    } 
} 

kullanımı:

IFooData newFoo = FooRepository.Insert(f => 
    { 
     f.Name = "New Foo"; 
    }); 

fabrika uygulaması Bence eşit derecede zarif çözüm olmasına rağmen. Sorunuzu cevaplamak için, çok benzer bir yaklaşım benim deneyimimde, hiçbir zaman büyük sorunlara karşı gelmedim ve bence doğru yoldasınız demektir :)

+0

Cevabınız için teşekkürler. Beton uygulamalarını oluşturmak için bir fabrikayı kullanmak için deponuzun ekleme yöntemiyle bir temsilci kullanma yaklaşımınızı tercih ederim. –

İlgili konular