Что делать в методе Dispose () - PullRequest
0 голосов
/ 25 сентября 2018

Отказ от ответственности: я знаю, что моё моделирование репозитория, вероятно, неверно, и я реорганизую его перед отправкой приложения.Но что я действительно хочу знать, так это о Dispose (), одно из моих сомнений связано с этой неправильной реализацией, но я надеюсь, что ответы, которые я получу здесь, помогут лучше понять этот метод для других частей моего приложения.

Так почему я считаю, что мой репозиторий неправильный?Я использую nhibernate, и из моих первых уроков, которые я прочитал, в приведенных примерах использовалось ключевое слово «using» в каждом методе репозитория (add, find, findall и т. Д.).Когда я начал нуждаться в отложенной загрузке, возникли проблемы, поэтому в своих поисках я наткнулся на статью Айенде в журнале MSDN об использовании nhibernate для настольных приложений, и это именно мой случай.По сути, уместно отметить, что докладчик (формы?) Должен контролировать сессию, а не ответственность хранилищаТак что я в основном поступил противоположно тому, что он сказал, потому что по какой-то причине (я действительно не помню) в то время я не хотел помещать ссылку на nhibernate как в проекте домена (который содержит мои репозитории nhibernate), так и впроект пользовательского интерфейса.Возможно, потому что я не хотел связывать пользовательский интерфейс с инфраструктурой ... В любом случае, я отвлекся.

Суть в том, что мои репозитории держат сессию открытой, пока они мне не нужны.И когда мне нужен какой-то доменный сервис, которому нужен репозиторий, я передаю его из формы.Но только потому, что этот репозиторий содержит сеанс, который мне нужно поддерживать во время запроса на услуги.

Например, у меня есть ComboBox, который заполняется сущностями «Материалы», полученными через репозиторий.Когда пользователь выбирает один, я передаю его методу GetPricesPerMaterial(Material x) «EstimatesCalculator», которому в конструкторе нужны репозитории, переданные ему формой, которую он назвал.Итак, мои репозитории являются IDisposable, потому что Session является IDisposable.Я вызываю Session.Dispose () в моих репозиториях Dispose ().

Теперь возникает вопрос: только потому, что службы (например, «EstimatesCalculator») содержат ссылку на IDisposable, они тоже должны быть IDisposable?Я уверен, что я буду распоряжаться этими ссылочными IDisposables в формах, которые они создали и передали в Службы, поэтому я думаю, что мне не нужно вызывать Repository.Dispose () в службах, но мне нужно, скажем, установитьэти ссылки на нуль или что-то?

1 Ответ

0 голосов
/ 25 сентября 2018

Если просто иметь связь с неуправляемым ресурсом (таким как соединение ADO.NET, содержащееся в сеансе NHibernate), то не реализуйте IDisposable.Реализуйте IDisposable, если вашему классу принадлежит неуправляемый ресурс (сеанс NHibernate) в вашем классе.Есть и другие случаи реализации IDisposable тоже.На них есть ссылка в ссылке Шаблон удаления .

Независимо от того, что вы утилизируете ресурс.Похоже, ваши формы владеют сессией.Вы должны просто утилизировать его там.

также смотрите: IDisposable Interface

...