2013-04-17 1 views
0

Мы создали несколько служб WCF, которые обрабатывают асинхронные запросы. Мы используем basicHttpBinding, поэтому наш InstanceContextMode - это PerCall, и это то, что вызывает небольшую путаницу. Мы наблюдаем необычное поведение с теми частями приложения, которое вводится с использованием контейнера Microsoft Unity.Конкуренты IoC в службе WCF

Мы решим приведенную ниже ссылку для создания синглета Foo, который используется во всем приложении. Однако, когда услуга попадает быстро, Foo будет иногда генерировать исключения, указывающие на то, что к ним обращаются несколько потоков и в результате его состояние изменяется неожиданным образом.

Container.RegisterType<IFoo, Foo>(new ContainerControlledLifetimeManager()); 

Теперь, если мы изменим менеджер пожизненная к TransientLifetimeManager - по существу говоря контейнер, чтобы придать новый экземпляр класса каждый раз, когда она решена, проблема будет устранена.

С моей точки зрения, WCF не контролирует время жизни AppDomain, хозяин делает. В нашем случае это IIS. Таким образом, учитывая эту информацию, возможно, что наши запросы WCF PerCall работают правильно, но из-за того, как управляется AppDomain, можно ли получить доступ к одному и тому же инжектированному объекту из-за его реализации singleton?

Спасибо за ваше время!

+0

единство создается внутри поведения IInstanceProvider или это инъекционные зависимости иначе? – ErnieL

ответ

0

Взгляните на UnityWcf. Я пробовал несколько разных подходов к выравниванию времени жизни объектов в Unity с InstanceContextMode в WCF. Это работает очень хорошо:

http://unitywcf.codeplex.com