Есть ли у StructureMap область видимости, соответствующая DefinesNamedScope / InNamedScope от NInject? - PullRequest
0 голосов
/ 03 марта 2011

Проблема, которую я хотел бы решить, - это совместное использование ISessionProvider между IXyzRepositories (где ISessionProvider содержит текущую NHibernate ISession).

Я настраиваю рецепт «Настройка сеанса для докладчика» из NHibernate 3 Cookbook , и хотел бы сохранить StructureMap (коричневый проект).

Ответы [ 2 ]

1 голос
/ 04 марта 2011

В веб-приложении я использую Singleton для sessionFactory и HybridHttpOrThreadLocalScoped для сессии: Это мой регистр структуры карты:

public class NhibernateRegistry: Registry
{
    public NhibernateRegistry()
    {
        For<ISessionFactory>()
        .Singleton()
        .Use(new NHibernateSessionFactory(connectionString).SessionFactory);

        For<ISession>()
        .HybridHttpOrThreadLocalScoped()
        .Use(o => o.GetInstance<ISessionFactory>().CurrentSession);
    }
}

Мой NHibernateSessionFactory похож на класс SessionProvider, используемый в книге. Все находится в конце запроса (веб-приложение):

protected void Application_EndRequest(object sender, EventArgs e)
{
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}

Я использую общий репозиторий:

public class GenericRepository<T> : IGenericRepository<T> where T : class
{
    private readonly ISession _session;

    public GenericRepository(ISession session)
    {
        _session = session;
    }

    public T Load(Guid Code)
    {
        return (_session.Load<T>(Code));
    }

}

но вы можете легко изменить его с помощью собственной реализации. Я регистрирую репозиторий здесь:

public class RepositoriesRegistry : Registry
{
    public RepositoriesRegistry()
    {
        For <Data.IRepository<Domain.Reminder, Guid>>()
            .HybridHttpOrThreadLocalScoped()
            .Use<Data.NH.Repository<Domain.Reminder, Guid>>();
    }
}
1 голос
/ 04 марта 2011

Я думаю, что для этого вам нужно создать собственный Lifecyle, хотя я не уверен, что именно вы пытаетесь достичь ...

Чтобы создать собственный жизненный цикл, вам просто нужно реализовать интерфейс ILifecycle и использовать его при регистрации. Вот пример, который вы можете посмотреть: http://blog.mikeobrien.net/2010/01/creating-structuremap-lifecycle-for-wcf.html.

...