2010-02-19 135 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。

玩得开心。