我在使用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>();
答案 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连接是一个非常复杂的野兽。