мой первый реальный (не тест) NHibernate/Castle.ActiveRecord проект развивается быстро. Я работаю с NHibernate/Castle.ActiveRecord около месяца, но до сих пор не знаю, как обрабатывать сеансы в приложении WindowsForms.NHibernate/Castle.ActiveRecord; Управление сеансом; WinForms
Общие погрузо-методы шва не работать для меня:
- SessionPerRequest, SessionPerConversation и т.д. все работают только для WebApplications и т.д.
- SessionPerApplication не Рекомендуемые нами очень опасно/когда я правильно
- SessionPerThread не очень полезен, так как у меня либо есть только один поток, либо WindowsForms-thread, либо для каждой кнопки - новый поток. Первое, что заставит мое приложение использовать слишком много памяти и хранить старые объекты в memmory. С помощью рабочих потоков для нажатия кнопки ech я отключил бы ленивую загрузку, так как мои загруженные объекты будут жить дольше, чем поток.
- SessionPerPresenter также не работает, поскольку распространено, что я открываю «суб-презентатор» в форме, позволяющей пользователю искать/загружать/выбирать некоторые объекты, на которые ссылаются (foreigen key), и привести к уничтожению презентатора - что означает сеанс закрыт - но объект, используемый в «супер-презентаторе» для заполнения ссылочного свойства (foreigen key).
Я использовал Google и бинг часами и много читал, но нашел только один хороший сайт о моем случае: http://msdn.microsoft.com/en-us/magazine/ee819139.aspx. Там SessionPerPresenter используется, но для «суб-презентатора» ему предоставляется только id, а не весь объект! И это говорит о том, что в этом примере нет никаких ключей ключа и нет сценариев, в которых объект возвращается в «супер-презентатор».
Qestions
- есть ли другой способ обработки для WindowsForms/десктоп-приложение сессии?
- Я мог бы добавить свойство session-session или параметр-session-constructor для всех моих презентаторов, но мне нехорошо иметь сеансовую обработку всего моего ui-кода.
- Когда происходит исключение, NHibernate хочет, чтобы я убил сессию. Но если это «только» исключение бизнес-логики, а не исключение NHibernate?
Пример
Я пытаюсь сделать пример крышку большой частью моей проблемы.
// The persisten classes
public class Box
{
public virtual int BoxId{get;set;}
public virtual Product Content{get;set;}
...
}
public class User
{
public virtual int UserId{get;set;}
public virtual IList<Product> AssigenedProducts{get;set;}
...
}
public clas Product
{
public virtual int ProductId{get;set;}
public virtual string PrductCode{get;set;}
}
.
// The presenter-classes
public class ProductSearchPresenter : SearchPresenter<Product> { ... }
public class ProductEditPresenter : EditPresenter<Product> { ... }
public class UserSearchPresenter : SearchPresenter<User> { ... }
public class UserEditPresenter : EditPresenter<User> { ... }
public class BoxSearchPresenter : SearchPresenter<Box> { ... }
public class BoxEditPresenter : EditPresenter<Box> { ... }
// The search-presenters allow the user to perform as search with criterias on the class defined as generic argument and to select one of the results
// The edit-presenters allow to edit a new or loaded (and given as parameter) object of the class defined as generic argument
Теперь у меня есть следующие примеры использования, которым все могут быть выполнены в одном приложении, в то же время асинхронный (использование просто вызывают переключение между докладчиками).
- используя экземпляр BoxSearchPresenter для поиска и выберите объект
- часть этого USECASE является использование экземпляра ProductSearchPresenter заполнить критерии в BoxSearchPresenter
- часть этого USECASE является использование экземпляр BoxEditPresenter для редактирования и сохранения выбранного объекта в BoxSearchPresenter инстанции
- используя экземпляр UserSearchPresenter для поиска и выбора объекта
- часть этого USECASE является использование экземпляра UserEditPresenter для редактирования и сохранения slected объекта UserSearchPresenter
- частью этого USECASE является использование ProductSearchPresenter для поиска и выбора объектов, которые будут добавлены в User.AssignedProducts ,
- Использование экземпляра ProductSearchPresenter для поиска и выбора объекта.
- часть этой утилиты - это использование экземпляра ProductEditPresenter для редактирования и сохранения выбранного объекта ProductSearchPresenter.
Это только небольшая коллекция usecases, но есть Allready много проблем, у меня есть.
- UseCase 1. и 2. запускаются одновременно в одной и той же нитью.
- UseCase 1.1. и 2.2. верните туда выбранные объекты другим ведущим, которые используют эти объекты дольше, чем существуют те, кто загрузил объект.
- UseCase 3.1. может изменить объект, загруженный из 2.2./1.1. до 3.1. был начат, но когда 2.2./1.1. совершается до 3.1. закончен, объект будет сохранен, и невозможно «откат» 3.1.
Здравствуйте Денис Biondic, спасибо много. Я понимаю, что вы говорите, но я смущаюсь, как IoC-Container должен знать, что делать с UnitOfWork? Особенно в том сценарии, когда клиенты редактируются в одном блоке, а в другом только загружаются. Каким-то образом IoC-Container должен был бы знать об объектах с единичной рабочей нагрузкой, которые одновременно являются активными в ОЗУ и как-то сообщать appart, когда использовать их. Приветствую Juy Juka @Denis Biondic –