Позвонить в веб-сервис изнутри или снаружи модели? - PullRequest
2 голосов
/ 04 августа 2010

Я ищу руководство по архитектуре создаваемого приложения.Вот ситуация:

Наша компания выдает продавцам поощрительные карточки, которые затем выдаются клиентам (используются как дебетовые карточки).В целях отслеживания продавец должен запросить активацию в нашей системе, прежде чем использовать карту (предоставив информацию о том, кому она была передана и почему).Фронтальным приложением является ASP.NET MVC 2. Служба Windows будет периодически проверять запросы на активацию и вызывать веб-службу компании, выпустившей карту (на самом деле это две компании-карты и две службы), чтобы активировать ее.Затем он отмечает состояние карты как активированной в БД.

Мое решение разделено на 5 проектов: Web, Data (модель и хранилище), CompanyClients (доступ к двум веб-службам), Service (окна).Служба) и тесты.

В настоящее время некоторые вещи, которые можно использовать в службе Windows, могут выглядеть следующим образом:

using (var repo = new Repository())
{
    var cards = repo.GetAllPendingCardsWithOrderAndCompany();

    foreach (var card in cards)
    {
        var client = CompanyClientFactory.GetClient(card);

        try
        {
            client.ActivateCard(card);
            card.ActivationDt = DateTime.Now;
        }
        catch(Exception ex)
        {
            // Error logging goes here
        }
    }
    repo.Save();
}

Это работает, но я не могу не думать овопрос Модель анемичной области .Должен ли я добавить в Card метод с именем Activate (), который получает клиент веб-службы и пытается выполнить активацию и сам журнал?Это сделает службу Windows намного чище:

using (var repo = new Repository())
{
    var cards = repo.GetAllPendingCardsWithOrderAndCompany();

    foreach (var card in cards)
    {
        card.Activate();
    }
    repo.Save();
}

Однако для этого потребуется, чтобы проект Data ссылался на CompanyClients.Сам CompanyClients уже ссылается на Data, поэтому это создаст круговую зависимость.Я мог бы объединить два проекта вместе, но мне это не кажется правильным (поскольку я хотел бы в конечном итоге перейти к POCO и разделить модель и доступ к данным для различных проектов).

Есть мысли о лучшем способе организовать это?

Ответы [ 2 ]

1 голос
/ 09 августа 2010

В конце концов, ответ на вопрос о том, будет ли звонить изнутри или снаружи класса Card, пришел к более глубокому размышлению об этом с точки зрения ОО. Хотя на первый взгляд неплохо сгруппировать эту функциональность, для карты нет смысла активировать себя. Так что в любом случае это относится к классу Card.

Что касается вопроса о том, как разделить между различными проектами, я думаю, этот ответ имеет смысл, который использует отдельный интерфейс, для которого есть отличный учебник: Рефакторинг сервисных зависимостей в разделенные Интерфейс .

0 голосов
/ 05 августа 2010

Да, я понимаю вашу проблему, вы спрашиваете, нормально ли ставить методы доступа к данным на классы модели или оставлять их на клиентах, это проект, который содержит методы для доступа к веб-сервисам.

У меня были похожие мысли о похожем проекте, и я решил сделать классы Model очень простыми, у них на самом деле нет никаких методов, только свойства.

Кроме того, концепция подключения Клиентом к веб-сервисам также не соответствует действительности.Клиент также должен зайти в проект Models.Код, который вы сейчас используете для подключения к веб-сервисам, должен быть перемещен в отдельный проект с именем WebServiceProxy или что-то в этом роде.

Этот проект должен следовать шаблону Репозиторий / Сервис .В связанной статье на самом деле обсуждается шаблон репозитория в связи с веб-сервисами (помимо обычных вещей Repository to DB).

HTH

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