Преобразовать этот фрагмент Виндзор в StructureMap для NHibernate - PullRequest
0 голосов
/ 14 сентября 2011

Может ли кто-нибудь помочь мне преобразовать приведенное ниже в 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. resolAll что делает?

Я новичок в StructureMap (и DI в целом), поэтому, пожалуйста, не думайте, что я знаю большое спасибо.

1 Ответ

1 голос
/ 14 сентября 2011

Ниже приведены типичные настройки, которые я использовал для подключения 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 ().

...