Внедрение ISession в мои репозитории с помощью Structuremap в приложении Asp.Net MVC

Все мои репозитории принимают ISession в конструкторе:

protected Repository(ISession session)
{
     this.session = session;
}
private readonly ISession session;

Как в приложении Asp.Net MVC, использующем StructureMap, настроить ISession в реестре StructureMap? Нужно ли мне добавить SessionFactory в контейнер? FluentNHibernate меняет вещи?

Ответы на вопрос(2)

это вопрос & ответы могут помочь вам.

Один из способов - украсть управление сессиями nhibernate изS # arp Architecture ", Работает отлично.

Решение Вопроса

Еще один вариант (не всегда лучший, но простой в использовании) заключается в следующем:

Реализация интерфейсов ISession и ISessionFactory (SessionProxy и SessionFactoryProxy).

public class SessionAggregator : ISession {
    protected ISession session;

    public SessionAggregator(ISessionFactory theFactory) {
        if (theFactory == null)
            throw new ArgumentNullException("theFactory", "theFactory is null.");
        Initialise(theFactory);
    }

    protected virtual void Initialise(ISessionFactory factory) {
        session = factory.OpenSession();
    }
    // the ISession implementation - proxy calls to the underlying session  
 }

public class SessionFactoryAggregator : ISessionFactory {
    protected static ISessionFactory factory;
    private static locker = new object();
    public SessionFactoryAggregator() {
            if (factory == null) {
              lock(locker) {
                if (factory == null)
                  factory = BuildFactory();
              }
            }
    }

    // Implement the ISessionFactory and proxy calls to the factory                
}

Таким образом, вы можете просто зарегистрировать ISession (реализованный SessionAggregator) и ISessionFactory (SessionFactoryAggreagator), и любая инфраструктура DI легко разрешит ISession.

Это хорошо, если ваш DI не поддерживает фабричный метод (я нене знаю, если карта структуры делает).

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

РЕДАКТИРОВАТЬ: Теперь, чтобы использовать ISession в веб-приложении:

Зарегистрируйте SessionFactoryAggregator на карте структуры (время жизни может быть одноэлементным).Зарегистрируйте SessionAggregator на карте Snstrucure и установите для его времени жизни значение InstanceScope.Hybrid.В конце каждого запроса вам нужно избавиться от сеанса, вызвав HttpContextBuildPolicy.DisposeAndClearAll ()

Код может выглядеть так:

// The Registry in StructureMap
ForRequestedType<isessionfactory>()
        .CacheBy(InstanceScope.Singleton)
        .TheDefaultIsConcreteType<sessionfactoryaggregator>();

ForRequestedType<isession>()
        .CacheBy(InstanceScope.Hybryd)
        .TheDefaultIsConcreteType<sessionaggregator>();

// Then in EndRequest call
HttpContextBuildPolicy.DisposeAndClearAll()
</sessionaggregator></isession></sessionfactoryaggregator></isessionfactory>
 Dmytrii Nagirniak20 авг. 2009 г., 01:35
Мы обновили ответ, чтобы показать, как его зарегистрировать.
 mxmissile19 авг. 2009 г., 22:17
Я действительно ищу пример StructureMap или, используя ваш пример, как бы я внедрил SessionAggregator и SessionFactoryAggregator в контейнер. Принимая во внимание среду веб-приложений, контекст, сессии и т. Д.
 mxmissile20 авг. 2009 г., 16:27
Тот'именно то, что я искал, спасибо.

Ваш ответ на вопрос