Я знаю, что это отчасти мертвая лошадь, но я не нахожу удовлетворительного ответа. Прежде всего, позвольте мне сказать, что я НЕ имею дело с веб-приложением, иначе управлять NH Session довольно просто.
У меня есть куча корпоративных компонентов. Эти компоненты имеют свой собственный сервисный уровень, который будет работать с несколькими хранилищами. Например:
- Компонент заявки
- Служба обработки претензий
- Репозиторий заявок
- Компонент биллинга
- Биллинговая служба
- Хранилище счетов
- Компонент политики
- PolicyLockService
- Хранилище политик
Теперь у меня может быть консоль или приложение для Windows, которое должно координировать операцию, которая включает в себя каждую из служб. Я хочу написать сервисы, в которые будут внедрены (DI) их необходимые репозитории. В репозитории должен быть вставлен сеанс ISession или аналогичный, чтобы я мог выполнить эту операцию в рамках одной транзакции ISession / IT.
Мне известно о паттерне Unit Of Work и множестве сэмплов, но ни один из них не показал DI. Я также с подозрением отношусь к [ThreadStatic], потому что этот материал также можно использовать из WCF, и я нашел достаточно постов, описывающих, как это сделать. Я читал о бизнес-беседах, но мне нужно кое-что простое, чтобы каждое приложение для Windows / консоли могло легко загрузиться, так как у нас есть много этих приложений и несколько довольно неопытных разработчиков.
Так как я могу настроить StructureMap для внедрения одной и той же сессии ISession в каждый из зависимых репозиториев из приложения? Вот полностью надуманный и полностью составленный пример без использования SM (только для пояснения - не тратьте энергию на критику):
ConsoleApplication
Main
{
using(ISession session = GetSession())
using(ITransaction trans = session.BeginTransaction())
{
var policyRepo = new PolicyRepo(session);
var policyService = new PolicyService(policyRepo);
var billingRepo = new BillingRepo(session)
var billingService = new BillingService(billingRepo);
var claimRepo = new ClaimsRepo(session);
var claimService = new ClaimService(claimRepo, policyService, billingService);
claimService.FileCLaim();
trans.Commit();
}
}