SOA, TDD, DI & DDD - игра Shell?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 SOA, TDD, DI & DDD - игра Shell?

Сообщение Anonymous »

Хорошо, я постараюсь пойти по короткому и прямому доступу. Я пытаюсь разработать многоуровневое многоуровневое сервисное приложение, которое является тестируемым и поддерживает инъекцию зависимостей. Вот что у меня есть: < /p>

На уровне сервиса у меня есть метод начала, который принимает некоторые ключевые данные, необходимые для того, чтобы начать сеанс. Мой сервисный класс представляет собой фасад и делегаты в экземпляр интерфейса IsessionManager, который вводится в конструктор класса сервиса. Таким образом, у меня есть IsessionRepository, с которым будут работать мои объекты домена и что я реализую с помощью технологии доступа к данным. IsessionRepository имеет методы для GetByID, добавления и обновления. Этот класс координирует операции с моим сессионным доменом/бизнес -объектом. И вот где появляется игра и проблема Shell.public ISession StartSession(object sessionStartInfo)
{
var session = Session.GetSession(sessionStartInfo);

if (session == null)
session = Session.NewSession(sessionStartInfo);

return session;
}
< /code>

У меня есть три задачи с этим кодом: < /p>


Во -первых, очевидно, что я мог бы перенести эту логику в метод пассажиров в классе моего сеанса, но я думаю, что это победит цель класса SessionManager, который затем просто станет вторым (или он все еще считается координатором?). Увы, игра Shell.
< /li>
Второе, SessionManager имеет тесную связь с классом сеанса. Я подумал о создании IsessionFactory/SessionFactory, который можно ввести в SessionManager, но тогда у меня была бы такая же жесткая связанная с этим на заводе. Но, может быть, это нормально? В конце концов, мы хотим избежать «нового» экземпляра объекта и позволить контейнеру вернуть нам экземпляр. И True Di говорит, что мы не должны ссылаться на контейнер напрямую. Итак, как тогда я получу конкретный класс IsessionRepository, введенный в свой объект домена сеанса? Я вводил его в класс завода, а затем вручную перенести его в сеанс при построении нового экземпляра (используя «новый»)?
< /li>
< /ul>

Имейте в виду, что это также только одна операция, и мне также необходимо выполнять другие задачи, такие как сэкономить сеанс, в перечислении сеансов, основанных на различных критических объектах, а также другие объекты Domain. Кроме того, объект сеанса также инкапсулирует бизнес -логику для авторизации, проверки и т. Д. Поэтому (я думаю), он должен быть там. Я использую DI для нарушения зависимостей, чтобы мы могли легко реализовать модульные тесты с использованием макетов, а также дать нам возможность вносить изменения в конкретные реализации, не требуя изменений в нескольких областях. /> обновление < /strong> < /p>

Мне попросили предоставить дополнительный код, так что как можно более кратко: < /p>

[ServiceContract()]
public class SessionService : ISessionService
{
public SessionService(ISessionManager manager) { Manager = manager; }

public ISessionManager Manager { get; private set; }

[OperationContract()]
public SessionContract StartSession(SessionCriteriaContract criteria)
{
var session = Manager.StartSession(Mapper.Map(criteria));

return Mapper.Map(session);
}
}

public class SessionManager : ISessionManager
{
public SessionManager() { }

public ISession StartSession(SessionCriteria criteria)
{
var session = Session.GetSession(criteria);

if (session == null)
session = Session.NewSession(criteria);

return session;
}
}

public class Session : ISession
{
public Session(ISessionRepository repository, IValidator validator)
{
Repository = repository;
Validator = validator;
}

// ISession Properties

public static ISession GetSession(SessionCriteria criteria)
{
return Repository.FindOne(criteria);
}

public static ISession NewSession(SessionCriteria criteria)
{
var session = ????;

// Set properties based on criteria object

return session;
}

public Boolean Save()
{
if (!Validator.IsValid(this))
return false;

return Repository.Save(this);
}
}
< /code>

и, очевидно, существует интерфейс IsessionRepository и конкретный класс xyzsessionRepository, который, как я не думаю, нужно показать. < /p>

2nd update < /strong> < /p>

Я добавил. Компоненты используются.

Подробнее здесь: https://stackoverflow.com/questions/550 ... shell-game
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему Google DNS отвечает SOA на запрос CNAME?
    Anonymous » » в форуме Python
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • C# SOA против производительности
    Anonymous » » в форуме C#
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • C# SOA против производительности
    Anonymous » » в форуме C#
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Проблема с Саймоном, говорящим, что игра на Python с использованием Tkinter – игра завершается неправильно
    Anonymous » » в форуме Python
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous
  • Означает ли `shell` в `shell=True` в подпроцессе `bash`?
    Anonymous » » в форуме Python
    0 Ответы
    53 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»