2011-09-14 4 views
0

아래에서 구조 맵으로 변환 할 수 있습니까?이 Windsor 스 니펫을 NHibernate의 StructureMap으로 변환하십시오.

public class NHibernateInstaller : IWindsorInstaller 
{ 
    #region IWindsorInstaller Members 

    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(Component.For<ISessionFactory>() 
           .UsingFactoryMethod(k => BuildSessionFactory())); 

     container.Register(Component.For<NHibernateSessionModule>()); 

     container.Register(Component.For<ISessionFactoryProvider>().AsFactory()); 

     container.Register(Component.For<IEnumerable<ISessionFactory>>() 
            .UsingFactoryMethod(k => k.ResolveAll<ISessionFactory>())); 

     HttpContext.Current.Application[SessionFactoryProvider.Key] 
         = container.Resolve<ISessionFactoryProvider>(); 
    } 

    #endregion 
    public ISessionFactory BuildSessionFactory() { ... } 
} 

나는 지금까지 내를 Global.asax이 있습니다

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 

    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 

    IContainer container = new Container(
     x => 
     { 
      x.For<ISessionFactory>().Use // ??? NHibernateHelper.BuildSessionFactory(); 

      x.For<IControllerActivator>().Use<StructureMapControllerActivator>(); 
      x.For<IBar>().Use<Bar>(); 
     } 
    ); 


    DependencyResolver.SetResolver(new StructuredMapDependencyResolver(container)); 
} 
  1. NHibernateHelper.BuildSessionFactory은(), ISessionFactory에 대한 것을 설정하는 방법을 잘 내 방법이 아닙니다.

  2. 내 컨테이너에 NHibernateSessionModule을 넣어야하는지 잘 모르겠다. web.config에서 모듈을 연결했는데 충분하지 않습니까?

  3. ISessionFactoryProvider가 ".AsFactory()"로 유선화 된 것처럼 나머지를 이해하지 못합니다. 구현을 제공 할 필요가 없습니까?

  4. resolveAll은 무엇을하고 있습니까?

저는 StructureMap (및 일반 DI)을 처음 사용 했으므로 추후에 많이 감사드립니다.

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에서 참조 구현을 가지고 :

답변

1

다음 내가 StructureMap와 자 NHibernate를 배선에 사용한 전형적인 설정입니다. CP.FluentlyPersistent.Web/Global.asax.cs로 시작하여이를 수행하십시오. NHibernate를 연결하기 위해 StructureMap Registry 클래스를 사용하지만 구문은 매우 유사합니다.


UPDATE합니다 (NHibernateInstaller 클래스의 라인에 대한 귀하의 의견/질문에 대답하기) :

짧은 대답이 클래스를 제거 - 당신은 SessionFactoryProvider라는 ISessionFactoryProvider의 구현을 제공하면 필요하지 않은 . 이 행을 global.asax.cs에 HttpContext.Current.Application[SessionFactoryProvider.Key] = container.GetInstance<ISessionFactoryProvider>();으로 추가하십시오.

이유는 다음과 같습니다. StructureMap에서 어셈블리 스캐닝을 사용하면 NHibernateSessionModule을 등록 할 필요가 없습니다. 현재 SM 바이너리에는 Windsor가 가지고있는 typed-factory 구현이 포함되어 있지 않지만 구현은 GitHub 소스 (AutoFactory 찾기)에 있습니다. 이 제한을 피하려면 GetSessionFactories() 메서드를 사용하여 SessionFactoryProvider라는 ISessionFactoryProvider 파생을 만들어야합니다.

+0

아주 좋은, btw, 당신은 무엇을 위해 무국적 세션을 사용합니까? 성능상의 이유로 읽기 전용 객체를위한 것입니까? – Blankman

+0

btw, 저는 이것을 사용하고 있습니다 : https://gist.github.com/852307 – Blankman

+0

이 기사는 http://nhforge.org/blogs/nhibernate/archive/2011/03/03/effective-nhibernate- session-management-for-web-apps.aspx – Blankman

관련 문제