Совместное использование RijndaelManaged, Enterprise Library и Autofac

Я недавно экспериментирую с блоком приложения криптографии, используя Autofac в качестве контейнера.

В результате я использую пакет nuget EntLibContrib 5.0 - Autofac Configurator.

С помощью DPAPI Symmetric Crypto Provider я смог отлично зашифровать / расшифровать данные.

Однако с RijndaelManaged я получаю ActivationException:

Microsoft.Practices.ServiceLocation.ActivationException: произошла ошибка активации при попытке получить экземпляр типа ISymmetricCryptoProvider, ключ «RijndaelManaged» ---> Autofac.Core.Registration.ComponentNotRegisteredException: запрошенная служба RijndaelManaged (Microsoft.Practiseurity. Cryptography.ISymmetricCryptoProvider) 'не зарегистрирован. Чтобы избежать этого исключения, либо зарегистрируйте компонент для предоставления услуги, проверьте регистрацию службы с помощью IsRegistered (), либо используйте метод ResolveOptional () для разрешения необязательной зависимости.

Следуйте инструкциям здесь: http://msdn.microsoft.com/en-us/library/ff664686(v=pandp.50).aspx Я пытаюсь внедрить CryptographyManager в 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 эта информация определена для symricCryptoProviders:

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.NET MVC3 и службами WCF, размещенными на http.

Тогда мой начальный код станет более простым:

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


person Ken    schedule 08.03.2012    source источник


Ответы (1)


На самом деле я написал конфигуратор Autofac EntLib (с некоторой помощью некоторых людей из 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.

Извините, это не супер ответ. Подключение EntLib к IoC - действительно сложная штука.

person Travis Illig    schedule 09.03.2012
comment
Спасибо за ваш отзыв. Я буду иметь это в виду в будущем. Поскольку я уже перешел на Unity, и, похоже, он отлично подходит для моих нужд, я не тратил время на проверку вашей теории. Технически ваш ответ является ответом, поэтому я отмечу его как таковой. - person Ken; 12.03.2012