Хорошо, я постараюсь пойти по короткому и прямому доступу. Я пытаюсь разработать многоуровневое многоуровневое сервисное приложение, которое является тестируемым и поддерживает инъекцию зависимостей. Вот что у меня есть: < /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
SOA, TDD, DI & DDD - игра Shell? ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение