2010-02-19 171 views
0

我是WCF的全新品牌,我想知道如何構建我的設計。 我想公開所有我的域對象的方法能夠獲取和設置它們的屬性。我把它們全部分成了自己的界面。即)WCF多個服務合同

public interface IGroupDAO { 
    IEnumerable<Group> FindGroup(string criteria); 
    Group GetGroup(int groupID); 
    IEnumerable<Group> GetSubGroups(int groupID); 
    List<IDMatch> UpdateGroups(Group[] groups); 
} 
public interface IUserDAO { 
    IEnumerable<User> FindUser(string criteria); 
    IEnumerable<User> GetSubUsers(int userID); 
    User GetUser(int userID); 
    List<IDMatch> UpdateUsers(User[] users); 
} 
... etc 

從,如果你爲每個服務合約創建一個終點我明白的終點是所有獨立的權利?我問的原因是,如果我想創建一個容納所有更新語句的事務。即

CreateTransaction(); 
UpdateGroups(groups); 
UpdateUsers(user); 
CommitTransaction(); 

如果我分開暴露所有的服務合同,這是可能做到的嗎?我希望確保在提交事務之前保存所有內容,以便我不會將數據模型置於未知狀態。

我有一個想法是將所有的接口聚合在一起

public interface IAppDAO : IGroupDAO, IUserDAO {} 

這樣我可能暴露一切,很容易在需要時重新排序服務上的更新。因此,如果我必須在用戶面前保存一組子組,則可以保存其他組或其他任何奇怪的情況。我想保留服務中的所有保存邏輯,以便客戶端可以啞巴並說「保存所有這些東西」,然後在我的提交中,服務應該正確地重新排列所有內容並更新適當的來源。

讓我知道,如果我瘋了,或者如果我能以不同的方式建築這個?

感謝

P.S)我有一個問題...如果我暴露我必須連接到每一個單獨的權利多個服務合同?所以我必須分別驗證每一個?

回答

0

實際上,您不需要將DAO接口公開爲服務合約。定義一個服務合同界面,將包含例如方法Update

[ServiceContract] 
public interface IMyServiceContract 
{ 
    [OperationContract] 
    void Update(User[] users, Group[] groups); 
} 

public class MyService : IMyServiceContract 
{ 
    private readonly IUserDAO _userDao; 
    private readonly IGroupDAO _groupDao; 
    public MyService(IUserDAO userDao, IGroupDAO groupDao) 
    { 
     _userDao = userDao; 
     _groupDao = groupDao; 
    } 

    public void Update(User[] users, Group[] groups) 
    { 
     _groupDao.UpdateGroups(groups); 
     _userDao.UpdateUsers(users); 
    } 
} 

您可能implement定製IOperationInvoker並將其插入到WCF來處理事務。

+0

我還會公開DAO接口來獲取對象嗎?即GetUser(int id);我喜歡更新的想法,我可以通過所有的東西。 – HaxElit 2010-02-23 17:46:20

+0

不,DAO接口是內部的,不應該暴露。您只公開將被客戶端使用的方法。要實現那些依賴DAO接口的方法。 – 2010-02-23 17:56:03

0

我不會去說'瘋狂'。我會說你應該做一些關於面向對象和SOA的閱讀,也許,嗯,閱讀一些做這類事情的項目的源代碼。

您的計劃向我表明,WCF的經驗不足並不是這裏的突出問題。你需要對系統設計有更基本的把握,否則你會發現自己在追逐鬼魂。

當您準備好時,要搜索的內容與您的問題相關的是Session-Per-Request。

玩得開心。