0

私のアプリケーションには、同じソフトウェアとハ​​ードウェアを備えた 10 個の WCFService (プラットフォーム .NET Framework 3.5 の WCFService アプリケーション) がありますが、この例外を受け取るのは 1 つだけです。

ユーザーがログインすると、次のメソッドが呼び出されます。

  public IService Select(SelectServiceRequest request)
        {
            IAxxxService anagServ = IoC.Container.Resolve<IAxxxService>(request.GetRegisteredService().ToString());
            return xxxServ;
        }
  • 最初の実行で ClientIdentifier = 0 の GetRegisteredService() 実装を使用

    public RegisteredServices GetRegisteredService()
        {
            RegisteredServices res = RegisteredServices.Estxxx;
            if (ClientIdentifier == 0)
            {
                res = RegisteredServices.Anaxxx;
            }
            else if (ClientIdentifier == 1)
            {
                res = RegisteredServices.Prixxx;
            }
            else if (ClientIdentifier == 2)
            {
                res = RegisteredServices.Estrxxx;
            }
    
    
            else if (ClientIdentifier == 3)
            {
                res = RegisteredServices.LixxAnagrxx;
            }
    
            return res;
        }
    
    • IOC コードの実装と初期化:

      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, EstxxService>(RegisteredServices.Esxxxxx.ToString());
                          container.RegisterType<IService, StaxxxService>(RegisteredServices.Anaxxxx.ToString());
                          container.RegisterType<IService, PrixxxService>(RegisteredServices.Prixxxx.ToString()); 
                          container.RegisterType<IService, LixxxAxxxService>(RegisteredServices.LixxxAnagxx.ToString()); 
                                      isInitialized = true;
      
                      }
                  }
              }
              return container;
          }
      
      }
      

      }

実行方法「解決」でこの例外があります。

System.Reflection.TargetInvocationException: 呼び出しのターゲットによって例外がスローされました。---> Microsoft.Practices.Unity.ResolutionFailedException: 依存関係の解決に失敗しました。タイプ = "ApCon.IService"、名前 = "Anagxxx"。例外メッセージ: 現在のビルド操作 (ビルド キー Build Key[ApCon.StandardService, Anaxxxx]) が失敗しました: 現在のビルド操作 (ビルド キー Build Key[ApCon.StandardService, Anaxxxx]) が失敗しました: インデックスが配列の範囲外でした. (戦略タイプ DynamicMethodConstructorStrategy、インデックス 0) (戦略タイプ BuildPlanStrategy、インデックス 3) ---> Microsoft.Practices.ObjectBuilder2.BuildFailedException: 現在のビルド操作 (ビルド キー Build Key[ApCon.StandardService, Anagrafe]) が失敗しました: 現在のビルド操作 (ビルド キー Build Key[ApCon.StandardService, Anagrafe]) が失敗しました: インデックスが配列の範囲外でした。(戦略タイプ DynamicMethodConstructorStrategy、インデックス 0) (戦略タイプ BuildPlanStrategy、インデックス 3) ---> Microsoft.Practices.ObjectBuilder2.BuildFailedException: 現在のビルド操作 (ビルド キー Build Key[ApCon.StandardService, Anagxxx]) が失敗しました: インデックスが外部にありました配列の境界。(戦略タイプ DynamicMethodConstructorStrategy、インデックス 0) ---> System.IndexOutOfRangeException: インデックスが配列の範囲外でした。System.Collections.Generic.List1.Add(T item) で Microsoft.Practices.ObjectBuilder2.DependencyResolverTrackerPolicy.AddResolverKey(Object key) で Microsoft.Practices.ObjectBuilder2 で。

それはロック命令でしょうか?型が登録されておらず、isInitialized が true になったようです

4

2 に答える 2

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

于 2016-04-21T05:32:04.863 に答える
0

私が知る限り、あなたは の名前付きインスタンスを登録していますがIAnagrafeService、 の名前付きインスタンスを解決しようとしていますIService

私の推測では、最初のものは2番目のものから派生しているので、次のようなものが機能するはずです:

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

(もちろん、Unity の登録を変更することもできます。)

于 2016-04-19T15:54:49.547 に答える