Я знаю, что это немного мертвая лошадь, но я не нахожу удовлетворительного ответа. Сначала позвольте мне сказать, что я НЕ имею дело с веб-приложением, иначе управление NH Session довольно простое.NHibernate Session DI из StructureMap в компонентах
У меня есть группа компонентов предприятия. Эти компоненты имеют свой собственный уровень обслуживания, который будет действовать на несколько репозиториев. Например:
- претензии Компонент
- претензии Услуги по обработке
- Претензия Repository
- Billing Компонент
- Billing Service
- Billing Repository
- политики Компонент
- PolicyLockService
- Политика Repository
Теперь у меня может быть консоль или окна приложения, которое должно координировать работу, которая включает в себя каждой из услуг. Я хочу написать услуги, которые нужно ввести (DI) в их требуемые репозитории. Репозитории должны иметь ISession или аналогичные, вводимые в них, чтобы я мог выполнить эту операцию в рамках одного ISession/ITransaction.
Я знаю модель «Единица работы» и множество образцов там, но ни один из них не показал DI. Я также подвержен влиянию [ThreadStatic], потому что этот материал также можно использовать из WCF, и я нашел достаточно сообщений, описывающих, как это сделать. Я читал о Business Conversations, но вам нужно что-то простое, что каждое приложение для 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();
}
}
Вы можете сделать это с помощью AsSingleton в конфигурации StructureMap , но вы, вероятно, не хотите использовать один сеанс для всех приложений. – Paco
Правильно, я не хочу использовать один для каждого приложения. –
Я прочитал сообщение Джереми Д. Миллерса об использовании NH в Dovetail 100 раз и думаю, что есть что-то вложенные контейнеры, но я не могу найти много, чтобы помочь обвести вокруг него голову. –