0

Autofacをコンテナとして使用しながら、暗号化アプリケーションブロックを新たに実験しています。

その結果、私はnugetパッケージEntLibContrib 5.0--AutofacConfiguratorを使用しています。

DPAPI Symmetric Crypto Providerを使用すると、データを正常に暗号化/復号化することができました。

ただし、RijndaelManagedを使用すると、ActivationExceptionが発生します。

Microsoft.Practices.ServiceLocation.ActivationException:タイプISymmetricCryptoProvider、キー「RijndaelManaged」のインスタンスを取得しようとしたときにアクティブ化エラーが発生しました---> Autofac.Core.Registration.ComponentNotRegisteredException:要求されたサービス'RijndaelManaged(Microsoft.Practices.EnterpriseLibrary.Security。 Cryptography.ISymmetricCryptoProvider)'は登録されていません。この例外を回避するには、サービスを提供するコンポーネントを登録するか、IsRegistered()を使用してサービス登録を確認するか、ResolveOptional()メソッドを使用してオプションの依存関係を解決します。

ここでの手順に従って:http://msdn.microsoft.com/en-us/library/ff664686 (v = pandp.50).aspxCryptographyManagerをMyServiceに挿入しようとしています。

私のブートストラップコードは次のようになります。

        var builder = new ContainerBuilder();
        builder.RegisterEnterpriseLibrary();
        builder.RegisterType<MyService>().As<IMyService>();
        _container = builder.Build();

        var autofacLocator = new AutofacServiceLocator(_container);
        EnterpriseLibraryContainer.Current = autofacLocator;

App.configには、symmetricCryptoProvidersに対して定義された次の情報があります。

name: RijndaelManaged
type: Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.HashAlgorithmProvider, Microsoft.Practices.EnterpriseLibrary.Security.Cryptography, Version=5.0.505.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
algorithmType:System.Security.Cryptography.RijndaelManaged
protectedKeyFilename:[path_to_my_key]
protectedKeyProtectionScope: LocalMachine

このテクノロジーの組み合わせの経験がある人はいますか?

いくつかのテストの後、代わりにUnityコンテナーを使用する可能性があると思います。これは、使用するもの以外にIOCコンテナーを優先しないため、ASP.NETMVC3およびhttpでホストされるWCFサービスとうまく統合する必要があるためです。

その後、私のブートストラップコードはより単純になります。

var container = new UnityContainer() .AddNewExtension<EnterpriseLibraryCoreExtension>(); container.RegisterType<IMyService, MyService>();

4

1 に答える 1

1

私は実際にAutofacEntLibconfiguratorを作成しました(P&P関係者の助けを借りて)。例外処理ブロックとロギングブロックでテストされていますが、暗号化関連のものでは試していません。

EntLibには興味深い点があり、登録済みのサービスに名前を付ける必要がある場合があります。例外から推測すると...

type ISymmetricCryptoProvider, key "RijndaelManaged"

... EntLibは、次のような名前付きサービスを登録することを望んでいると思います。

builder.Register(c =>
                 {
                   // create the HashAlgorithmProvider using
                   // RijndaelManaged algorithm
                 })
        .Named<ISymmetricCryptoProvider>("RijndaelManaged");

繰り返しになりますが、経験もテストもしていないので、正確な登録を推測していますが、EntLibは名前付きサービスを登録しようとしているのに対し、実際のサービスは登録されていません。名前

拡張機能はRegisterEnterpriseLibrary基本的に通過し、Unityが名前付き/名前なしの登録を行うために使用するのと同じアルゴリズムを使用しようとします。何かが正しく処理されないというエッジケースに遭遇したと思います。EntLibは、たとえ抽象化しようとしても、Unityと非常によく結びついています。

Autofacに縛られていない場合は、Unityが最も摩擦の少ない道になります。私はAutofacの使いやすさとより軽量な性質が好きで、私のアプリはそれに結びついているので、そのように機能するためにすべてが必要でした。そのような親和性がない場合は、Unityを使用する方が簡単かもしれません。

申し訳ありませんが、それは素晴らしい答えではありません。IoCでのEntLibの配線は、非常に複雑な獣です。

于 2012-03-09T18:56:19.550 に答える