2012-03-08 74 views
0

我正在尝试使用Autofac作为容器的加密应用程序块。一起使用RijndaelManaged,企业图书馆和Autofac

因此,我正在使用nuget包EntLibContrib 5.0 - Autofac Configurator

使用DPAPI对称密码提供程序,我能够很好地加密/解密数据。

然而,随着RijndaelManaged的,我收到一个ActivationException:尝试获取类型ISymmetricCryptoProvider,键 “RijndaelManaged的” ---> Autofac的情况下发生激活错误:

Microsoft.Practices.ServiceLocation.ActivationException。 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

其实我写的Autofac EntLib配置器(与一些在P & P乡亲的一些帮助)。它已经过异常处理模块和日志模块的测试,但我还没有用密码学的东西进行过测试。

EntLib有它有时需要注册服务被命名为一件有趣的事情,而我是从那里说异常猜测...

type ISymmetricCryptoProvider, key "RijndaelManaged" 

...我想EntLib想你注册名为服务,如:

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

我在准确的注册类的猜测,因为,再一次,我没有得到的经验与它或测试,但这个想法是,EntLib试图注册一个名为的服务而实际的服务没有得到注册的名称

RegisterEnterpriseLibrary延伸基本经过,并尝试使用统一使用做了名为/无名注册相同的算法。我猜你遇到了一些不能正确处理的边缘案例。 EntLib与Unity很好地绑在一起,即使他们试图将它抽象出来。

如果你不与Autofac绑在一起,Unity将成为你最低摩擦的前进道路。我喜欢Autofac的易用性和更轻量级的特性,而我的应用也与它相关联,所以我需要一切以这种方式工作;如果你没有这样的亲和力,可能会更容易使用Unity。

对不起,这不是一个超级回答。 IoC中的EntLib接线是一个非常复杂的野兽。

+0

感谢您的反馈。我将来会记住这一点。 因为我已经转向Unity,并且它似乎能满足我的需求,所以我没有花时间去测试你的理论。 您的答案在技术上是答案,所以我会将其标记为这样。 – Ken 2012-03-12 14:11:15