2016-04-19 3 views
0

Мое приложение имеет 10 WCFService (WCFService приложения на платформе .NET Framework 3.5) с тем же программным обеспечением и аппаратными средствами, но только 1 принимает это исключение:Unity + C# - "Постановление зависимости не удалось"

Когда пользователь регистрируется вызвать этот метод:

public IService Select(SelectServiceRequest request) 
     { 
      IAnagrafeService anagServ = IoC.Container.Resolve<IAnagrafeService>(request.GetRegisteredService().ToString()); 
      return anagServ; 
     } 
  • с GetRegisteredService() реализацию с ClientIdentifier = 0 для первого исполнения

    public RegisteredServices GetRegisteredService() 
        { 
         RegisteredServices res = RegisteredServices.Estrattori; 
         if (ClientIdentifier == 0) 
         { 
          res = RegisteredServices.Anagrafica; 
         } 
         else if (ClientIdentifier == 1) 
         { 
          res = RegisteredServices.Privacy; 
         } 
         else if (ClientIdentifier == 2) 
         { 
          res = RegisteredServices.Estrattori; 
         } 
    
    
         else if (ClientIdentifier == 3) 
         { 
          res = RegisteredServices.ListaAnagrafica; 
         } 
    
         return res; 
        } 
    
    • с реализации кода МОК и Initilization:

      internal class IoC{ 
          private static IUnityContainer container = new UnityContainer(); 
          private static bool isInitialized = false; 
      
      public static IUnityContainer Container 
      { 
          get 
          { 
           if (!isInitialized) 
           { 
            lock (container) 
            { 
             if (!isInitialized) 
      
      
              container.RegisterType<IService, EstattoriService>(RegisteredServices.Estrattori.ToString()); 
              container.RegisterType<IService, StandardService>(RegisteredServices.Anagrafica.ToString()); 
              container.RegisterType<IService, PrivacyService>(RegisteredServices.Privacy.ToString()); 
              container.RegisterType<IService, ListAnagService>(RegisteredServices.ListaAnagrafica.ToString()); 
                 isInitialized = true; 
      
             } 
            } 
           } 
           return container; 
          } 
      
      } 
      

      }

я есть это исключение на метод выполнения "Resolve":

System.Reflection.TargetInvocationException: Исключение было , брошенное объектом вызова. ---> Microsoft.Practices.Unity.ResolutionFailedException: сбой разрешения зависимости, тип = «ApCon.IService», name = «Anagrafe». Сообщение об исключении: Не удалось выполнить текущую операцию сборки (build key Build Key [ApCon.StandardService, Anagrafe]): Не удалось выполнить текущую операцию сборки (построить ключ Build Key [ApCon.StandardService, Anagrafe]): индекс находился за пределами границ массива. (Тип стратегии DynamicMethodConstructorStrategy, index 0) (Тип стратегии BuildPlanStrategy, index 3) ---> Microsoft.Practices.ObjectBuilder2.BuildFailedException: Не удалось выполнить текущую операцию сборки (ключ сборки Build [ApCon.StandardService, Anagrafe]): Не удалось выполнить текущую операцию сборки (ключ сборки Build Key [ApCon.StandardService, Anagrafe]): индекс находился за пределами границ . (Тип стратегии DynamicMethodConstructorStrategy, index 0) (Тип стратегии BuildPlanStrategy, index 3) ---> Microsoft.Practices.ObjectBuilder2.BuildFailedException: текущая операция сборки (ключ сборки Build Key [ApCon.StandardService, Anagrafe]) не удалось: Индекс находился за пределами массива. (Тип стратегии DynamicMethodConstructorStrategy, index 0) ---> System.IndexOutOfRangeException: индекс находился за пределами массива. на System.Collections.Generic.List1.Add (Т ст) при Microsoft.Practices.ObjectBuilder2.DependencyResolverTrackerPolicy.AddResolverKey (Object ключ) на Microsoft.Practices.ObjectBuilder2.ConstructorSelectorPolicyBase`1.CreateSelectedConstructor (IBuilderContext контексте, ConstructorInfo т е р) при Microsoft.Practices.ObjectBuilder2.ConstructorSelectorPolicyBase1.SelectConstructor (IBuilderContext контекста) при Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.PreBuildUp (IBuilderContext контекста) при Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp (IBuilderContext контекст) --- Конец внутренней трассировки стека исключений --- в

Может быть инструкция замок? Кажется, что типы не были зарегистрированы и isInitialized стало true

+0

ли вы добавить какие-либо buildoperations в вашем WCF-сервис? Как вы инициализируете Unity в своем сервисе? – smoksnes

+0

Я обновил вопрос, поэтому инициализация Unity входит в класс IoC. – Dilo

+0

Вы блокируете, потому что вы получаете доступ к нему с большим количеством потоков? – smoksnes

ответ

0

Рядом, как я могу сказать, вы регистрируете именованные экземпляры IAnagrafeService, но пытаетесь разрешить именованный экземпляр IService.

Мое предположение было бы, что первые происходит от второго, так что-то, как это должно работать: (. Или вы могли бы изменить регистрацию единства, конечно)

string name = request.GetRegisteredService().ToString(); 
IService anagServ = IoC.Container.Resolve<IAnagrafeService>(name); 

+0

Извините, я изменил код из-за конфиденциальности клиента. Но я сделал ошибку: i mean 'container.RegisterType (RegisteredServices.Estrattori.ToString()); ' PS. Я бы заменил IAnagrafeService на IService везде – Dilo

0

Я не» Думаю, это связано с тем, что услуги не регистрируются. Это обычно выбрасывает это исключение:

Текущий тип, IFoo, является интерфейсом и не может быть сконструирован. Есть у вас отсутствует сопоставление типов?

Это может быть результат блокировки. Вы можете попробовать этот шаблон вместо:

public static class IocContainer 
{ 
    private static readonly Lazy<IUnityContainer> Container = new Lazy<IUnityContainer>(() => 
    { 
     var container = new UnityContainer(); 

     // Do your registrations. 
     container.RegisterType<IService, EstattoriService>(RegisteredServices.Estrattori.ToString()); 
     container.RegisterType<IService, StandardService>(RegisteredServices.Anagrafica.ToString()); 
     container.RegisterType<IService, PrivacyService>(RegisteredServices.Privacy.ToString()); 
     container.RegisterType<IService, ListAnagService>(RegisteredServices.ListaAnagrafica.ToString()); 

     return container; 
    }); 

    public static IUnityContainer Instance 
    { 
     get { return Container.Value; } 
    } 
} 

Если это не вариант, вы можете попытаться не блокировать контейнеру себя:

internal class IoC{ 
    private static IUnityContainer container = new UnityContainer(); 
    private static bool isInitialized = false; 
    private static readonly object padlock = new object(); // lock object. 

public static IUnityContainer Container 
{ 
    get 
    { 
     if (!isInitialized) 
     { 
      lock (padlock) // Lock on padlock instead. 
      { 
       if (!isInitialized) 


        container.RegisterType<IService, EstattoriService>(RegisteredServices.Estrattori.ToString()); 
        container.RegisterType<IService, StandardService>(RegisteredServices.Anagrafica.ToString()); 
        container.RegisterType<IService, PrivacyService>(RegisteredServices.Privacy.ToString()); 
        container.RegisterType<IService, ListAnagService>(RegisteredServices.ListaAnagrafica.ToString()); 
           isInitialized = true; 

       } 
      } 
     } 
     return container; 
    } 
} 

Я считаю, это хороший источник для одноплодной шаблон.

http://csharpindepth.com/Articles/General/Singleton.aspx

+0

Спасибо за вашу поддержку, возможно, какой-то параллельный доступ в контейнере создал проблему в индексе внутреннего списка (исключение говорит: индекс был за пределами массива). – Dilo

+0

Так вы где можете решить проблему? Как ты сделал это? – smoksnes

+0

Мне нравится второе решение. Но у меня проблема: я не знаю, как воссоздать ошибку, потому что я не знаю, что ее вызвало. Вы знаете, как я могу воссоздать это исключение? Я также могу использовать режим отладки или принудительно использовать код. – Dilo

 Смежные вопросы

  • Нет связанных вопросов^_^