Enterprise library 将RijndaelManaged、Enterprise Library和Autofac结合使用

Enterprise library 将RijndaelManaged、Enterprise Library和Autofac结合使用,enterprise-library,autofac,rijndaelmanaged,Enterprise Library,Autofac,Rijndaelmanaged,我在使用Autofac作为容器的同时,正在试验加密应用程序块 因此,我使用的是nuget软件包EntLibContrib 5.0-Autofac Configurator 使用DPAPI对称加密提供程序,我可以很好地加密/解密数据 但是,通过RijndaelManaged,我收到一个ActivationException: Microsoft.Practices.ServiceLocation.ActivationException:尝试获取类型为IsSymmetricCryptoProvide

我在使用Autofac作为容器的同时,正在试验加密应用程序块

因此,我使用的是nuget软件包EntLibContrib 5.0-Autofac Configurator

使用DPAPI对称加密提供程序,我可以很好地加密/解密数据

但是,通过RijndaelManaged,我收到一个ActivationException:

Microsoft.Practices.ServiceLocation.ActivationException:尝试获取类型为IsSymmetricCryptoProvider、密钥“RijndaelManaged”的实例时发生激活错误-->Autofac.Core.Registration.ComponentNotRegistereException:请求的服务“RijndaelManaged”(Microsoft.Practices.EnterpriseLibrary.Security.Cryptography.IsSymmetricCryptoProvider)“”尚未注册。若要避免此异常,请注册组件以提供服务,使用IsRegistered()检查服务注册,或使用ResolveOptional()方法解析可选依赖项

根据此处的说明: 我正在尝试将CryptographyManager注入MyService

我的引导代码如下所示:

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

        var autofacLocator = new AutofacServiceLocator(_container);
        EnterpriseLibraryContainer.Current = autofacLocator;
有人有过这种技术组合的经验吗

经过一些测试后,我相信我可能会选择Unity容器,因为我对IOC容器没有任何偏好,除了我所使用的应该与ASP.NET MVC3和http托管的WCF服务很好地集成的容器之外

然后,我的引导代码变得更简单:

var container=newunitycontainer()
.AddNewExtension();

container.RegisterType();
我实际上编写了Autofac EntLib配置程序(在一些p&p人员的帮助下)。它已经用异常处理块和日志记录块进行了测试,但我还没有用加密技术进行过测试

EntLib有一个有趣的地方,它有时需要命名注册的服务,我从异常中猜测,它说

type ISymmetricCryptoProvider, key "RijndaelManaged"
…我认为EntLib希望您注册一个命名服务,如:

builder.Register(c =>
                 {
                   // create the HashAlgorithmProvider using
                   // RijndaelManaged algorithm
                 })
        .Named<ISymmetricCryptoProvider>("RijndaelManaged");
builder.Register(c=>
{
//使用创建HashAlgorithmProvider
//RijndaelManaged算法
})
.命名为(“RijndaelManaged”);
我在猜测确切的注册情况,因为我还没有使用它的经验或测试过它,但我的想法是EntLib正在尝试注册一个命名的服务,而实际的服务没有使用该名称注册

registerenterprisebrary
扩展基本上使用了Unity用于进行命名/未命名注册的相同算法。我猜您遇到了一个边缘情况,其中有些事情没有得到正确的处理。EntLib与Unity有很好的关联,即使他们试图将其抽象掉

如果你不依赖于Autofac,那么Unity将是你前进道路上摩擦最小的一条路。我喜欢Autofac的易用性和更轻量的特性,我的应用程序也依赖于它,所以我需要所有东西以这种方式工作;如果你没有这样的亲和力,只使用Unity可能会更容易


很抱歉,这不是一个很好的答案。IoC中的EntLib wire是一个非常复杂的问题。

谢谢你的反馈。我以后会记住这一点。因为我已经切换到Unity,而且它似乎非常适合我的需要,所以我没有花任何时间测试你的理论。你的答案从技术上讲是一个答案,所以我会这样标记它。
builder.Register(c =>
                 {
                   // create the HashAlgorithmProvider using
                   // RijndaelManaged algorithm
                 })
        .Named<ISymmetricCryptoProvider>("RijndaelManaged");