Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / комисарское тело di / 25 сообщений из 41, страница 1 из 2
25.11.2013, 22:40
    #38477380
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
по поводу трехдневного срача по di
оставив за бортом тему sl или di
хочу ( и призываю вас подвести резюме) по поводу освобождения ресурсов через di.
так как реализаций ди очень много порядка 180 - 200 штук в топе только порядка десятки, стоит рассмотреть
это на примере Unity
реализация укладывается в концепцию кеширование захваченного объекта, то есть реализована фитча для гурманов -, можно получать:
объект как общий синглтон, как синглтон на период запроса, на период работы в потоке, или еще как ( еще как вы можете реализовать сами
создав свою модель кеширования - управление жизнью объекта( ну например один для всего контекста формы))

Если вы захватили ссылку на объект в контейнере, то уж ничего не остается как при удалении контейнера удалять правильно объекты которые захватили ресурсы, вот пример синглтона для всей жизни рабочего контейнера,
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
namespace Microsoft.Practices.Unity
{
    /// <summary>
    /// A <see cref="LifetimeManager"/> that holds onto the instance given to it.
    /// When the <see cref="ContainerControlledLifetimeManager"/> is disposed,
    /// the instance is disposed with it.
    /// </summary>
    public class ContainerControlledLifetimeManager : SynchronizedLifetimeManager, IDisposable
    {
        private object value;

        /// <summary>
        /// Retrieve a value from the backing store associated with this Lifetime policy.
        /// </summary>
        /// <returns>the object desired, or null if no such object is currently stored.</returns>
        protected override object SynchronizedGetValue()
        {
            return value;
        }

        /// <summary>
        /// Stores the given value into backing store for retrieval later.
        /// </summary>
        /// <param name="newValue">The object being stored.</param>
        protected override void SynchronizedSetValue(object newValue)
        {
            value = newValue;
        }

        /// <summary>
        /// Remove the given object from backing store.
        /// </summary>
        public override void RemoveValue()
        {
            Dispose();
        }

        ///<summary>
        ///Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
        ///</summary>
        ///<filterpriority>2</filterpriority>
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this); // shut FxCop up
        }

        /// <summary>
        /// Standard Dispose pattern implementation. Not needed, but it keeps FxCop happy.
        /// </summary>
        /// <param name="disposing">Always true, since we don't have a finalizer.</param>
        // FxCop suppression: This method is only here to avoid the other IDisposable warning.
        [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "disposing")]
        protected void Dispose(bool disposing)
        {
            if (value != null)
            {
                if (value is IDisposable)
                {
                    ((IDisposable) value).Dispose();
                }
                value = null;
            }
        }
    }
}


то есть объект захвачен и при диспоузе контейнера, происходит освобождение ресурсов объекта ( если он наследует IDisposable)
а вот дефолтное поведение, у которого нет этого счастья, при каждом запросе - создается новый объект, тут надежда
на разработчика.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
  public class TransientLifetimeManager : LifetimeManager
    {
        /// <summary>
        /// Retrieve a value from the backing store associated with this Lifetime policy.
        /// </summary>
        /// <returns>the object desired, or null if no such object is currently stored.</returns>
        public override object GetValue()
        {
            return null;
        }

        /// <summary>
        /// Stores the given value into backing store for retrieval later.
        /// </summary>
        /// <param name="newValue">The object being stored.</param>
        public override void SetValue(object newValue)
        {
        }

        /// <summary>
        /// Remove the given object from backing store.
        /// </summary>
        public override void RemoveValue()
        {
        }
    }


Так стоит или не стоит рукоблудить, конечно стоит, работайте в своей парадигме как и раньше, Диспозьте по надобности,
тут дело вот в чем:
1 сам паттерн допускает многократное повторение операции.

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


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


ну и про сам контейнер, не велика птица протаскивать его через конструктор, делаем закрытый от всех контейнер, а наружу выставляем IUnityContainer через CreateChildContainer(), т.е. контейнер дитя - контракт на одноразовую работу, потом по надобности прибиваем..
сам никогда этой штуковиной не пользовался - дополняйте....
Просьба не сильно с...ть, охотник по пятам, уже два топика накрыл...
...
Рейтинг: 0 / 0
25.11.2013, 22:53
    #38477391
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
Где-то в степит.е. контейнер дитя - контракт на одноразовую работу, потом по надобности прибиваем..
нормальный ход
...
Рейтинг: 0 / 0
25.11.2013, 22:57
    #38477394
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
Не, я придерживаюсь идеологии статичности контейнера. Доступен на протяжении жизни апп домена.
...
Рейтинг: 0 / 0
25.11.2013, 23:04
    #38477396
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
МСУ,
да пускай так будет, делаешь статический. регистрируешь типы, и от него получаешь детей для работы, а как ты хотел в статическом -одно на все приложение освобождать объекты которые захвачены - в конце приложения?, получается они все время жизни приложения там таскаться будут?
...
Рейтинг: 0 / 0
25.11.2013, 23:17
    #38477405
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
МСУ,
примерно так через nuget расширить можно
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
public static class Bootstrapper
    {
        public static IUnityContainer UnityContainer
        {
            get
            {
                return _container.CreateChildContainer();
            }
        }
        private static IUnityContainer _container;
       

        public static void Initialise()
        {
             _container = BuildUnityContainer();

            DependencyResolver.SetResolver(new UnityDependencyResolver(_container));
        }

         static IUnityContainer BuildUnityContainer()
        {
            var container = new UnityContainer();

            // register all your components with the container here
            // it is NOT necessary to register your controllers
            
            // e.g. container.RegisterType<ITestService, TestService>();            

           
           
            return container;
        }
    }
...
Рейтинг: 0 / 0
25.11.2013, 23:20
    #38477408
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
Где-то в степи, не понял вопроса. В конце приложения будет выгрузка домена, можно даже не заморачиваться о диспоузе managed объектов. Во-вторых, статический контейнер вполне себе резолвит сервисы в соответствии с их заданными life time. То есть диспосабельные сервисы ты дестроишь сам по месту. В mvc я их дестрою автоматом в базовом контроллере, все сервисы там ленивые, разумеется.
...
Рейтинг: 0 / 0
25.11.2013, 23:27
    #38477411
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
МСУ,
да ради бога, если все в елочку, кто запрещает, тем более там все захваты монитором лочатся, но очевидный путь для меня через детей, тем более при желании можно исполнять с ними разные кренделя с регистрацией, и легко убивать, не затрагивая контейнер папу..
...
Рейтинг: 0 / 0
25.11.2013, 23:29
    #38477414
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
вы как будто намеряно игнорируете UOW. не сложилось чтоле?
об этом элегантном паттерне только ленивый не написал...
...
Рейтинг: 0 / 0
25.11.2013, 23:31
    #38477417
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
Где-то в степичего стоит опасаться:
1 если объект захвачен контейнером, при повторном вызове уже освобожденного объекта - можно нарваться на инвалида.
2 если вы запустите объект куда нибудь за облака а потом его отдеспоузите через контейнер - то за облаками будет null.

не стоит этого опасаться, если все классы будут делать только свою работу, и не лезть вперёд батьки, делая чужую работу.
...
Рейтинг: 0 / 0
25.11.2013, 23:38
    #38477424
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
Где-то в степихочу ( и призываю вас подвести резюме) по поводу освобождения ресурсов через di.

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

не надо вот это вот. об этом сервисе DI пусть позаботиться, а вот этот я сам убью.
хреновая практика это.

остальное by design.
...
Рейтинг: 0 / 0
25.11.2013, 23:46
    #38477433
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
hVostt,
что значит поручить di? как была работа с уничтожением по надобности так и будет, не зависимо откуда объект.
я ведь у ди могу и не поставить using или Dispose, и никакого освобождение ( декларированого) не произойдет, только коллектором через финализатор в будущем,....
...
Рейтинг: 0 / 0
25.11.2013, 23:52
    #38477443
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
hVostt, как ты не понимаешь, оберни ты в единицу работы объекты либо работай непосредственно с объектом, это освобождение уже не контейнером. Те же самые яйца, только через дополнительную абстракцию. Ты точно так же контролируешь жизнь объекта руками через using. А мне не нужны в данном случае дополнительные абстракции в виде единицы работы, у меня и так в руках абстракция сервиса и я знаю, что именно сейчас нужно его шлепнуть. Зачем мне "шлепнуть" дополнительно паковать в UoW? Это называется бездумное программирование ради программирования.
...
Рейтинг: 0 / 0
25.11.2013, 23:54
    #38477444
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
Где-то в степиhVostt,
что значит поручить di? как была работа с уничтожением по надобности так и будет, не зависимо откуда объект.
я ведь у ди могу и не поставить using или Dispose, и никакого освобождение ( декларированого) не произойдет, только коллектором через финализатор в будущем,....

т.е. считаешь, если у зависимости имеется IDisposable, значит потребитель во что бы то ни стало должен сделать Dispose? (как минимум в конце своей жизни)

ну тогда DI должен всегда создавать новый экземпляр каждой зависимости. никакого времени жизни у компонентов больше нет.

или по обстоятельствам?

предлагаешь компонентам вот такие коменты писать:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
// please kill me
public interface ISomeService: IDisposable
{
...
}

// big brother: don't kill it! I'll do it myself.
public interface IOtherService: IDisposable
{
....
}
...
Рейтинг: 0 / 0
25.11.2013, 23:59
    #38477450
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
hVostt,
по обстоятельствам, я уже ранее высказал свою точку зрение на эти сервисы времени жизни, - фуфло..
...
Рейтинг: 0 / 0
26.11.2013, 00:00
    #38477451
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
МСУhVostt, как ты не понимаешь, оберни ты в единицу работы объекты либо работай непосредственно с объектом, это освобождение уже не контейнером. Те же самые яйца, только через дополнительную абстракцию. Ты точно так же контролируешь жизнь объекта руками через using. А мне не нужны в данном случае дополнительные абстракции в виде единицы работы, у меня и так в руках абстракция сервиса и я знаю, что именно сейчас нужно его шлепнуть. Зачем мне "шлепнуть" дополнительно паковать в UoW? Это называется бездумное программирование ради программирования.

это ты не понимаешь в чем смысл наличия Dispose у единицы работы. для удобства.

UOW может быть и таким:

Код: c#
1.
2.
3.
4.
public interface IUOW
{
     void TheEnd();
}



что поменялось? просто стало менее удобно им пользоваться. не получится RAII.

МСУи я знаю, что именно сейчас нужно его шлепнуть

ну тогда тебе точно DI ни в одно место не впился. ты всё итак знаешь. так можно и компилятор подвинуть. суть в том, чтобы не знать. а ты норовишь у контекста вызвать диспоуз, аж кипятком писаешь. причин не объсняешь, надеюсь это не какая-то травма в детстве?

МСУЗачем мне "шлепнуть" дополнительно паковать в UoW?

я попытаюсь тебе объяснить. потому что может быть ему ещё рано умирать. может конечно и сразу сдохнуть, а может еще пожить и послужить. не тебе решать. а контейнеру DI.

представь твоим компонентом IDataContext пользуется другой программист. и ты ему забыл объяснить, что его надо сразу, сабаку такую, убивать на месте. без суда и следствия. и без вопросов!...
...
Рейтинг: 0 / 0
26.11.2013, 00:01
    #38477453
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
Где-то в степипо обстоятельствам

ну ок. твоё право. тогда мне добавить больше нечего, я тоже высказал свою точку зрения.
...
Рейтинг: 0 / 0
26.11.2013, 00:01
    #38477454
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
hVosttГде-то в степи
ну тогда DI должен всегда создавать новый экземпляр каждой зависимости. никакого времени жизни у компонентов больше нет.
Создавать всегда новый экземпляр - не вопрос, вопрос в том, как и где нужно шлепнуть этот экземпляр.
...
Рейтинг: 0 / 0
26.11.2013, 00:04
    #38477455
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
МСУСоздавать всегда новый экземпляр - не вопрос, вопрос в том, как и где нужно шлепнуть этот экземпляр.

лишь бы без фанатизма
...
Рейтинг: 0 / 0
26.11.2013, 00:05
    #38477458
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
hVostt,
Код: c#
1.
не тебе решать. а контейнеру DI.

это обыкновенная защита от дурака, которую Вы идеализируете,
Dispose в финализаторе - то же защита от дурака, но право никто же ее не идеализирует..
...
Рейтинг: 0 / 0
26.11.2013, 00:07
    #38477462
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
hVosttэто ты не понимаешь в чем смысл наличия Dispose у единицы работы. для удобства.
Я понимаю смысл UoW, в данном случае он вообще не в кассу. Вот для таких задач он в кассу. У абстракции сервиса есть Dispose, я его и вызываю по месту.

hVosttну тогда тебе точно DI ни в одно место не впился. ты всё итак знаешь. так можно и компилятор подвинуть. суть в том, чтобы не знать. а ты норовишь у контекста вызвать диспоуз, аж кипятком писаешь. причин не объсняешь, надеюсь это не какая-то травма в детстве?
Я не понимаю, смысл DI только в управлении жизнью через UoW? То есть если мне не нужен в данной задаче UoW, значит мне не нужен DI? Бред. Я уже писал, нынешние DI контейнеры могут много чего, но если я чем-то не пользуюсь, это не значит, что мне не нужен функционал DI. Тем более когда идет речь о диспоузинге по месту.

hVosttМСУЗачем мне "шлепнуть" дополнительно паковать в UoW?
я попытаюсь тебе объяснить. потому что может быть ему ещё рано умирать. может конечно и сразу сдохнуть, а может еще пожить и послужить. не тебе решать. а контейнеру DI.
Не рано - это 100%. Я дергаю веб сервис, получаю данные и мне сразу же нужно закрыть сокет, чтобы не держать дорогостоящее соединение. Никаких пожить сервису!

hVosttпредставь твоим компонентом IDataContext пользуется другой программист. и ты ему забыл объяснить, что его надо сразу, сабаку такую, убивать на месте. без суда и следствия. и без вопросов!...
Ради бога. У моего IDataContext есть IDisposable, если у программиста есть голова на плечах, он должен будет высвобождать объект при ненадобности. Классика вроде.
...
Рейтинг: 0 / 0
26.11.2013, 00:08
    #38477463
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
Где-то в степиэто обыкновенная защита от дурака, которую Вы идеализируете,
Dispose в финализаторе - то же защита от дурака, но право никто же ее не идеализирует..

ну хз. не вижу причин обсирать малину. есть хороший приём, существуют богатые на возможности инструменты. нахрена городить какую-то хрень, если сразу можно обеспечить соблюдение принципов SOLID и да. защита от дурака это очень важно. ибо мы люди, а не роботы, и не можем помнить досканально каждую строчку кода проекта, и как с чем надо себя вести.
...
Рейтинг: 0 / 0
26.11.2013, 00:10
    #38477464
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
МСУРади бога. У моего IDataContext есть IDisposable, если у программиста есть голова на плечах, он должен будет высвобождать объект при ненадобности. Классика вроде.

классика, если ты самолично его получил. через new или Container.GiveMeThisItem().

А если тебе его сунули через инъекцию зависимости, такого права уже у тебя нет. есть только допущение, о том, что ты можешь так сделать и тебе ничего за это не будет.
...
Рейтинг: 0 / 0
26.11.2013, 00:10
    #38477465
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
hVosttМСУСоздавать всегда новый экземпляр - не вопрос, вопрос в том, как и где нужно шлепнуть этот экземпляр.
лишь бы без фанатизма
Я с тобой согласен, есть куча задач с life time, когда с уничтожением по дефолту справляется контейнер. Особенно если идет речь о веб приложениях, так вообще всё просто - жизнь на реквест и море по колено. Но в долгоиграющих песочницах такие шутки уже не прокатят, нужен целенаправленный продуманный ход: попользовался дорогостоящим - освободи, иначе он будет сидеть долго и упорно в "вечном контексте". Вот что я хотел до тебя довести. И только.
...
Рейтинг: 0 / 0
26.11.2013, 00:11
    #38477466
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
МСУНикаких пожить сервису!
...
Рейтинг: 0 / 0
26.11.2013, 00:12
    #38477468
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
комисарское тело di
hVosttМСУРади бога. У моего IDataContext есть IDisposable, если у программиста есть голова на плечах, он должен будет высвобождать объект при ненадобности. Классика вроде.

классика, если ты самолично его получил. через new или Container.GiveMeThisItem().

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

А не вызывает подозрение, что тебе инжектировали диспосабельный экземпляр? Уже повод задуматься.
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / комисарское тело di / 25 сообщений из 41, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]