Можно ли условно привязать Ninject Bind? - PullRequest
2 голосов
/ 18 марта 2011

Можно ли условно разрешить правильную ISession область действия на основе атрибута действия MVC?

Bind<ISession>().ToMethod(ctx => (ISession)NHibernateHelper.Open())
                .InRequestScope();

Bind<ISession>().ToMethod(ctx => (ISession)NHibernateHelper.Open())
                .InSessionScope();

Псевдокод для возможного решения:

Bind<ISession>().ToMethod(...).InSessionScope()
                .WhenActionHasAttribute(LongConversation);

// else use this binding
Bind<ISession>().ToMethod(...).InRequestScope()

Возможно, мой подход некорректен, и я открыт для альтернативных решений моей проблемы.

В зависимости от типа «разговора» в сети, мне нужнолибо оставьте NHibernateSession для запроса / ответа HTTP или для сеанса HTTP.Большинство разговоров длится только один HTTP-запрос / ответ.

Примечание : InSessionScope согласно Фредрик Калсет

Ответы [ 2 ]

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

Remo ваш ответ не является правильным в каждом случае. Есть причина, по которой вы должны делать доступ ISession прямо на вашем контроллере. то есть по соображениям производительности имеет смысл напрямую запрашивать сеанс в контроллере. Когда контроллеры несут единоличную ответственность за отображение, например, определенного клиента, зачем вам напрямую вызывать ISession.Load (id)? Все остальное может быть ненужной абстракцией.

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

Доступ к сеансу напрямую с контроллеров в любом случае не очень хороший дизайн. Контроллер много делает в этом случае.

Я бы предпочел внедрить разные сервисы, которые бы получали NHilbernate с разными областями действия и вставляли их в ваши контроллеры. Таким образом, должно быть очень легко определить две обязательные привязки. Например, вы можете добавить в сервис атрибут, который объявляет, какой сеанс должен быть внедрен, и использовать WhenClassHas в привязках.

...