Ниже приведены типичные настройки, которые я использовал для подключения StructureMap и NHibernate:
IContainer container = new Container(c =>
{
c.Scan(s=>
{
// This autoregisters the IFoo to Foo
s.AssembliesFromApplicationBaseDirectory();
s.WithDefaultConventions();
};
// SessionFactory needs to be a singleton object
c.ForSingletonOf<ISessionFactory>()
.Use(NHibernateHelper.BuildSessionFactory());
// Add your own interceptor implementation here
c.For<IInterceptor>().Use<EmptyInterceptor>();
// I assume that NHibernateSession uses the NHibernateSessionModule
// I use a similar implementation named TransactionBoundaryModule
c.For<INHibernateSession>()
.HybridHttpOrThreadLocalScoped()
.Use<NHibernateSession>();
// Gets the current session from the NHibernateSession
// Ensures one session per request
c.For<ISession>().Use(x =>
{
var instance = x.GetInstance<INHibernateSession>();
return instance.CurrentSession;
});
// Same for StatelessSession
c.For<IStatelessSession>()
.Use(x => x.GetInstance<ISessionFactory>()
.OpenStatelessSession());
};
К вашему сведению ... У меня есть эталонная реализация на https://github.com/codeprogression/Fluently-Persistent. Начните с CP.FluentlyPersistent.Web / Global.asax.cs и выполните его до конца.Я использую класс StructureMap Registry
для подключения NHibernate, но синтаксис очень похож.
UPDATE (чтобы ответить на ваш комментарий / вопрос о строках в классе NHibernateInstaller):
Краткий ответ: удалить класс - он не нужен, если вы предоставите реализацию ISessionFactoryProvider с именем SessionFactoryProvider.Добавьте эту строку: HttpContext.Current.Application[SessionFactoryProvider.Key] = container.GetInstance<ISessionFactoryProvider>();
в ваш global.asax.cs.
Вот почему ... В StructureMap, при сканировании сборки, нет необходимости регистрировать NHibernateSessionModule.Текущие двоичные файлы SM не включают в себя реализацию typed-factory, которую имеет Windsor, но реализация находится в исходном коде GitHub (ищите AutoFactory).Чтобы обойти это ограничение, вы должны создать производную ISessionFactoryProvider с именем SessionFactoryProvider с помощью метода GetSessionFactories ().