2011-02-02 62 views
6

我正在構建一個工具,它將通過SOAP API將文件導入到基於Web的應用程序,並且已經建立了我想通過C#接口導入的內容,以便可以將Web應用程序的模型數據封裝到可處理的某些內容中。領域建模 - 實現屬性或POCO的接口?

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 
} 

然後我有一個返回IBankAccount或任何與工廠類的集合來爲我創造BankAccounts我需要他們的倉庫。

我的問題是,這種方法會給我帶來很多痛苦,創建POCO會更好嗎?我想把所有這些都放在一個單獨的程序集中,並將數據訪問和業務邏輯完全分開,只是因爲我正在處理一個移動目標,這裏有關數據將在線存儲的位置。

回答

3

這正是我使用的方法,我從來沒有遇到任何問題。在我的設計中,來自數據訪問層的任何內容都被抽象爲一個接口(我將它們稱爲數據傳輸合同)。在我的域模型然後我有靜態方法來創建這些數據傳輸對象的業務實體..

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

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

它有非常方便您的域模型實體從多個數據採集合同的數據:

public class CompositeEntity 
{ 
    static public CompositeEntity FromDataTransport(IFooData fooData, IBarData barData) 
    { 
     ... 
    } 
} 

與您的設計相反,我不提供工廠來創建數據傳輸合同的具體實現,而是提供代表來編寫值並讓存儲庫擔心創建具體對象

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

用法:

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

雖然工廠實現在我看來是一個同樣優雅的解決方案。回答你的問題,在我的經驗中,我從未遇到任何重大問題,我認爲你在這裏的正確軌道:)我的經驗非常類似的方法

+0

感謝您的答案。我更喜歡使用委託與存儲庫的插入方法來使用工廠來創建具體實現的方法。 – 2011-02-02 14:41:34