Многократные контракты WCF - PullRequest
0 голосов
/ 19 февраля 2010

Я новичок в 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 {}

Таким образом, я мог бы разоблачить все и легко переупорядочить обновления в службе, если это необходимо.Так что, если бы мне пришлось сохранить подмножество групп перед пользователем, я мог бы сохранить остальные группы или любые странные случаи, подобные этому.Я хотел бы сохранить всю логику сохранения в службе, чтобы клиент мог быть глупым и сказать «Сохранить все эти вещи», тогда при моем подтверждении служба должна переупорядочить все правильно и обновить нужные источники.

Дайте мне знать, если я сумасшедший или я мог бы спроектировать это по-другому?

Спасибо

пс) У меня есть еще один вопрос ... если я выставляю несколько контрактов на обслуживание, у меня естьподключиться к каждому индивидуально правильно?Таким образом, я должен был бы подтвердить подлинность каждого из них в отдельности?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2010

На самом деле вам не нужно выставлять свои интерфейсы 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);
    }
}

Вы можете реализовать пользовательский IOperationInvoker и подключить его к WCF для обработки транзакций.

0 голосов
/ 19 февраля 2010

Я бы не зашел так далеко, чтобы сказать «сумасшедший».Я бы сказал, что вам следует почитать об ООП и SOA и, возможно, прочитать исходный код для проектов, которые делают подобные вещи.

Ваш план показывает мне, что неопытность с WCF не является существенной проблемойВот.Вам нужно получить более фундаментальное представление о дизайне системы, или вы поймаете себя на том, что гонитесь за призраками.

Что-то, что нужно искать, имеет отношение к вашему вопросу, когда вы будете готовы, это Session-Per-Request.

Веселись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...