none
Unity IoC RRS feed

  • Вопрос

  • Доброго дня, уважаемые форумчане. Прошу помощи подлатать собственное образование. Нужен пример использования Unity для Wcf(например Unity.WCF) - очень интересует именно хостинг в службе Windows. И второй вопрос - использование синглтона при использовании Unity. Как реализовать зависимость от класса, который должен существовать в единственном экземпляре.

    Спасибо.

    3 апреля 2013 г. 18:22

Ответы

  • Unity - и другие контейнеры - это просто способ создать объект, разрешив при этом все его зависимости. Никаких особенностей для WCF нет - создайте один singleton-контейнер, и резолвите все через него. 

    Синглтоны в Unity реализуются через регистрации с ContainerControlledLifetimeManager - тогда объект будет жить ровно столько же, сколько живет контейнер.


    • Изменено PashaPash 3 апреля 2013 г. 18:28
    • Предложено в качестве ответа YatajgaEditor 4 апреля 2013 г. 6:31
    • Помечено в качестве ответа YatajgaEditor 4 апреля 2013 г. 11:11
    3 апреля 2013 г. 18:28
  • Да, правильно. Если в вашем примере два раза вызвать Resolve<IWcfPlcService>, то оба экземпляра сервиса получат ссылку на один и тот же экземпляр Connection.

    можете проверить в отладке - написать что-то вроде

    var service1 = container.Resolve<IWcfPlcService>();
    var service2 = container.Resolve<IWcfPlcService>();
    


    развернуть в watch service1.Connection и нажать make object id. И проверить service2.Connection - на нем тоже будет отметка {#1}.

    • Помечено в качестве ответа Little_Cat_2003 4 апреля 2013 г. 9:59
    4 апреля 2013 г. 9:28

Все ответы

  • Unity - и другие контейнеры - это просто способ создать объект, разрешив при этом все его зависимости. Никаких особенностей для WCF нет - создайте один singleton-контейнер, и резолвите все через него. 

    Синглтоны в Unity реализуются через регистрации с ContainerControlledLifetimeManager - тогда объект будет жить ровно столько же, сколько живет контейнер.


    • Изменено PashaPash 3 апреля 2013 г. 18:28
    • Предложено в качестве ответа YatajgaEditor 4 апреля 2013 г. 6:31
    • Помечено в качестве ответа YatajgaEditor 4 апреля 2013 г. 11:11
    3 апреля 2013 г. 18:28
  • Спасибо. Но вот его применение как раз и не понимаю. Допустим я в обычном приложении использую метод GetInstance для получения инстанса данного объекта. Есть интерфейс моего объекта IMySingleObject, есть его реализация MySingleObject: IMySingleObject в который добавлен статический метод получения инстанса - GetInstance. Объект формируется с параметрами в своем конструкторе. Вот как указать Unity способ формирования моего MySingleObject через его GetInstance. Я не вижу в примерах этого. Я так понял, контейнер сам следит за созданием синглтона и в данном случает наличие метода GetInstance не нужно? В моем случае при использовании Unity.WCF

    IUnityContainer container = new UnityContainer();                
    container.RegisterType<IWcfPlcService, WcfPlcService>()
             .RegisterType<IConnection, Connection>(new ContainerControlledLifetimeManager());

    где WcfPlcService - собственно сам сервис, а Connection - объект, который должен существовать в одном экземпляре. При этом контейнер сам инициализирует его и следит за количеством. Я правильно понял все?

    Спасибо за внимание к теме и новичкам.


    4 апреля 2013 г. 6:53
  • Да, правильно. Если в вашем примере два раза вызвать Resolve<IWcfPlcService>, то оба экземпляра сервиса получат ссылку на один и тот же экземпляр Connection.

    можете проверить в отладке - написать что-то вроде

    var service1 = container.Resolve<IWcfPlcService>();
    var service2 = container.Resolve<IWcfPlcService>();
    


    развернуть в watch service1.Connection и нажать make object id. И проверить service2.Connection - на нем тоже будет отметка {#1}.

    • Помечено в качестве ответа Little_Cat_2003 4 апреля 2013 г. 9:59
    4 апреля 2013 г. 9:28
  • Спасибо огромное. Вроде доходит потихоньку.

    4 апреля 2013 г. 9:58