Ninject - как держать константы в области видимости? - PullRequest
4 голосов
/ 05 марта 2011

Я хочу отправлять сообщения из разных частей приложения (ASP.NET) нескольким слушателям (например: элементы управления, отображающие эти сообщения => время жизни слушателя = время жизни запроса). Слушатели имеют разные типы, чтобы их можно было фильтровать при получении сообщений. Я хочу реализовать эту функциональность, используя Ninject, чтобы стать более гибким (добавление различных областей, решение типов, ...). На данный момент мне нужен был только случай с областью запроса, и я разработал без Ninject с использованием HttpContext.Current.Item["MyCollectionOfListeners"], но это слишком специфично, и я хочу обеспечить большую гибкость.

До сих пор мне не удалось найти решение для хранения констант в области и повторно использовать эти константы только для этой области. Например, константа может быть элементом управления ASP.NET, время жизни которого начинается внутри ее конструктора и заканчивается событием PreRender (потому что Render бесполезен). Это означает, что этот экземпляр слушателя будет добавлен в Ninject, а затем удален на PreRender.

Я думал о том, чтобы сделать что-то вроде:

Kernel.Bind<IMessageListener>.ToConstant(listener).InRequestScope();

или

Kernel.Bind<IMessageListener>.ToConstant(listener).InScope(ctx => listener);

но это не служит моему делу. Также константа возвращается для каждого запроса, и привязка не исчезает из коллекции после того, как константа выходит из области видимости. Также я не знаю, как удалить привязку на основе данного слушателя (константа).

Как правильно решить такой сценарий с помощью Ninject?

1 Ответ

2 голосов
/ 07 марта 2011

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

Что вы хотите сделать, это сделать с помощью ToMethod или ToProvider для возврата экземпляра.Область видимости, скорее всего, находится в области запроса или может быть страницей, на которой размещен элемент управления.Второй вариант немного сложнее.

...