一起使用RijndaelManaged,Enterprise Library和Autofac

时间:2012-03-08 23:12:18

标签: enterprise-library autofac rijndaelmanaged

我在使用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.Practices.EnterpriseLibrary.Security.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为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.NET MVC3和http托管的WCF服务集成。

我的自举代码变得更加简单:

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

1 个答案:

答案 0 :(得分:1)

我实际上编写了Autofac EntLib配置器(在一些P&amp; 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连接是一个非常复杂的野兽。