Как правильно настроить Spring.NET в веб-контексте - PullRequest
1 голос
/ 02 сентября 2011

У меня небольшая проблема, препятствующая появлению значений в области видимости для всех пользователей. Я не уверен, что именно я могу делать не так, но я в конце концов. Я думаю, что мои объекты-контейнеры имеют неправильную область видимости или я передаю значения по WebContext. Во-первых, вот что я делаю в коде. Это работает, но показывает детали для первого пользователя, который заходит на сайт (примечание: мой PageStore - это просто свойство типа IDictionary, в котором хранятся значения, которые будут доступны всем пользовательским элементам управления на странице):

using (BasePage page = (BasePage)(Spring.Web.UI.Page)this.Context.Handler) {
    if ((page.PageStore("LoginId") != null)) {
        this.Model.LoginId = Convert.ToString(page.PageStore("LoginId"));
    }
}

Во-вторых, я пробовал разные области для своих объектов, но я выхожу пустым. Вот как мои объекты сейчас настроены в контейнере:

Фрагмент конфигурации моего бизнес-уровня

 <!-- Transaction Management Strategy - local database transactions -->
    <object id="transactionManager"
          type="Spring.Data.Core.AdoPlatformTransactionManager, Spring.Data" scope="request">
        <property name="DbProvider" ref="MyProvider"/>
    </object>
    <tx:attribute-driven transaction-manager="transactionManager" />

    <!-- Data Access Objects -->
    <object id="DataAccess" type="MyApp.Business.DataAccess.DataAccess, MyApp.Business.DataAccess" abstract="true"  scope="request">
        <property name="AdoTemplate" ref="MyTemplate" />
    </object>

    <object id="ManagerDAO" type="MyApp.Business.DataAccess.ManagerDAO, MyApp.Business.DataAccess" parent="DataAccess" scope="request">
        <property name="TableName" value="vw_managers" />
        <property name="IsAllowedDeletion" value="False" />
        <property name="IsAllowedUniqueIdRetrieval" value="False" />
    </object>

     <!-- Services -->            

    <object id="SearchService" type="MyApp.Business.Services.SearchService, MyApp.Business.Services" scope="request">
        <property name="ManagerDAO" ref="UserDAO" />
    </object>

Фрагмент моего уровня представления:

<object id="BasePageModel" type="MyApp.Presentation.Models.BasePageModel, MyApp.Presentation" abstract="true"  scope="session"/>
<object id="ManagerModel" type="MyApp.Presentation.Models.ManagerModel, MyApp.Presentation" parent="BasePageModel"  scope="session"/>

<!-- Presenters-->    
<object name="ManagerPresenter" type="MyApp.Presentation.Presenters.ManagePresenter, MyApp.Presentation" singleton="false" scope="session">
    <property name="SearchSvc" ref="SearchService"/>
</object>

Фрагмент объектов моего пользовательского интерфейса:

    <!-- Pages -->
    <object id="BasePage" type="MyApp.UI.BasePage, MyApp.UI" abstract="true" singleton="false" scope="session" />    

    <object id="StandardPage" parent="BasePage" abstract="true" singleton="false" scope="session">
        <property name="MasterPageFile" value="~/Layouts/Site.master"/>
    </object>  
    <object type="~/Pages/Manager.aspx" parent="StandardPage" singleton="false" scope="session"/>

Я знаю, что у этого кота есть 100 способов, но самое быстрое решение - просто правильно настроить его и продолжить работу. У меня нестабильная конфигурация или все неправильно?

Редактировать: здравый смысл начинает действовать .... IDictionary не безопасен для потоков.

1 Ответ

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

Исправлена ​​моя проблема. Переключил мои объекты Dictionary на потоки безопасные объекты ConcurrentDictionary и исправил мои проблемы с областями видимости. Для областей мои объекты бизнес-уровня являются синглетонами, мои объекты модели находятся в области сеанса, а мои представления (пользовательские элементы управления) и страницы теперь настроены на область запроса, не являющиеся синглетонами.

...