【问题标题】:Activation error occured while trying to get instance of type ICacheManager, key "Cache Manager"尝试获取 ICacheManager 类型的实例时发生激活错误,键“缓存管理器”
【发布时间】:2011-09-08 05:03:15
【问题描述】:

我似乎在这里碰壁了,希望任何能够解决这个问题的人提供一些帮助。我不确定下面的错误消息是什么意思。我正在使用企业模式服务的缓存块,但我一直遇到以下问题。我下载了最新版本并尝试解决问题,但我似乎无法确定确切的问题,我需要帮助。提前致谢

Test method WorldBank.Service.Business.UnitTest.TopicsManagerTest.Call_Children_out_of_schoolTest threw exception: 
Microsoft.Practices.ServiceLocation.ActivationException: Activation error occured while trying to get instance of type ICacheManager, key "Cache Manager" ---> Microsoft.Practices.Unity.ResolutionFailedException: Resolution of the dependency failed, type = "Microsoft.Practices.EnterpriseLibrary.Caching.ICacheManager", name = "Cache Manager".
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The current type, Microsoft.Practices.EnterpriseLibrary.Caching.ICacheManager, is an interface and cannot be constructed. Are you missing a type mapping?
-----------------------------------------------
At the time of the exception, the container was:

  Resolving Microsoft.Practices.EnterpriseLibrary.Caching.ICacheManager,WuCache
 ---> System.InvalidOperationException: The current type, Microsoft.Practices.EnterpriseLibrary.Caching.ICacheManager, is an interface and cannot be constructed. Are you missing a type mapping?


Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForAttemptingToConstructInterface(IBuilderContext context) in e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\Strategies\BuildPlan\DynamicMethod\Creation\DynamicMethodConstructorStrategy.cs: line 209
BuildUp_Microsoft.Practices.EnterpriseLibrary.Caching.ICacheManager(IBuilderContext )
Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context) in e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\Strategies\BuildPlan\DynamicMethod\DynamicMethodBuildPlan.cs: line 37
Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context) in e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\Strategies\BuildPlan\BuildPlanStrategy.cs: line 43
Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context) in e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\ObjectBuilder\Strategies\StrategyChain.cs: line 110
Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable`1 resolverOverrides) in e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\UnityContainer.cs: line 511
Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable`1 resolverOverrides) in e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\UnityContainer.cs: line 515
Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name, ResolverOverride[] resolverOverrides) in e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\UnityContainer.cs: line 173
Microsoft.Practices.Unity.UnityServiceLocator.DoGetInstance(Type serviceType, String key) in e:\Builds\Unity\UnityTemp\Compile\Unity\Unity\Src\UnityServiceLocator.cs: line 64
Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(Type serviceType, String key) in c:\Home\Chris\Projects\CommonServiceLocator\main\Microsoft.Practices.ServiceLocation\ServiceLocatorImplBase.cs: line 49
Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance(Type serviceType, String key) in c:\Home\Chris\Projects\CommonServiceLocator\main\Microsoft.Practices.ServiceLocation\ServiceLocatorImplBase.cs: line 53
Microsoft.Practices.ServiceLocation.ServiceLocatorImplBase.GetInstance[TService](String key) in c:\Home\Chris\Projects\CommonServiceLocator\main\Microsoft.Practices.ServiceLocation\ServiceLocatorImplBase.cs: line 103
Microsoft.Practices.EnterpriseLibrary.Caching.CacheFactory.InnerGetCacheManager(String cacheManagerName) in e:\Builds\EntLib\Latest\Source\Blocks\Caching\Src\Caching\CacheFactory.cs: line 66
Microsoft.Practices.EnterpriseLibrary.Caching.CacheFactory.GetCacheManager(String cacheManagerName) in e:\Builds\EntLib\Latest\Source\Blocks\Caching\Src\Caching\CacheFactory.cs: line 53
WorldBank.Service.Business.ResponseManager.Get_w_Utility() in C:\SOOfficialPiece\WorldBank.Service.Business\ResponseManager.cs: line 42
WorldBank.Service.Business.ResponseManager..ctor() in C:\SOOfficialPiece\WorldBank.Service.Business\ResponseManager.cs: line 34
WorldBank.Service.Business.ResponseManager.getResponseObjectJSON(Int32 perpage, Object results, Boolean doDeepRetrieval) in C:\SOOfficialPiece\WorldBank.Service.Business\ResponseManager.cs: line 68
System.Dynamic.UpdateDelegates.UpdateAndExecute4[T0,T1,T2,T3,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3)
WorldBankBusiness.Topics.TopicsManager.Call_Children_out_of_school(PersonType persontype, EnrollmentType enrollmenttype, String countrycode) in C:\SOOfficialPiece\WorldBank.Service.Business\TopicsManager.cs: line 39
WorldBank.Service.Business.UnitTest.TopicsManagerTest.Call_Children_out_of_schoolTest() in C:\SOOfficialPiece\WorldBank.Service.Business.UnitTest\TopicsManagerTest.cs: line 88

【问题讨论】:

    标签: c# .net caching unity-container enterprise-library


    【解决方案1】:

    缓存应用程序块需要一些配置信息存在于 app/web.config 中才能使用(AFAIK,不幸的是很难找到另外说明的文档)。如果没有该配置信息,以下代码将导致抛出与您看到的相同的异常:

    var cm = CacheFactory.GetCacheManager("MyCacheManager");
    

    为了获得CacheManager,您需要在您的app.config 或web.config 中定义CacheManager

    <configuration>
        <configSections>
            <section name="cachingConfiguration" 
                     type="Microsoft.Practices.EnterpriseLibrary.Caching.Configuration.CacheManagerSettings, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
        </configSections>
        <cachingConfiguration defaultCacheManager="MyCacheManager">
            <cacheManagers>
               <add name="MyCacheManager" type="Microsoft.Practices.EnterpriseLibrary.Caching.CacheManager, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
                    expirationPollFrequencyInSeconds="60" 
                    maximumElementsInCacheBeforeScavenging="50000" 
                    numberToRemoveWhenScavenging="1000"  
                    backingStoreName="NullBackingStore" />
            </cacheManagers>
            <backingStores>
                <add type="Microsoft.Practices.EnterpriseLibrary.Caching.BackingStoreImplementations.NullBackingStore, Microsoft.Practices.EnterpriseLibrary.Caching, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
                     name="NullBackingStore" />
            </backingStores>
        </cachingConfiguration>
    </configuration>
    

    添加配置值后,您应该能够从CacheFactory 获得有效的CacheManagerpost 还提供了一些可能对您有所帮助的更多信息。

    值得注意的是,如果您使用的是 .NET 4.0,对于非 Web 应用程序,您可以使用 MemoryCache(在 System.Runtime.Caching 命名空间中),它提供了类似的功能,但不需要所有这些配置。对于网络应用,您当然可以使用System.Web.Caching 中的Cache 类。

    【讨论】:

    • 我使用与您的示例类似的配置。不同之处在于我使用了 IsolatedStorageBackingStore。它一直工作到现在。导致此错误的常见原因。
    • 错误来自 Unity(Unity 是一个 IoC 库),缓存应用程序块使用该库。每当你得到“***是一个接口,不能被构造。你是否缺少类型映射?”来自 Unity 的错误,这通常意味着尚未在 Unity 中注册类型映射,无论是在代码中还是通过配置文件。我没有足够的信息来说明您的代码为什么会停止工作,但如果您需要帮助,您应该发布一个单独的问题并提供尽可能多的详细信息。
    • 已经很久没有给出这个答案了,但我应该问:当我将它添加到我的 App.config 文件时,服务变得无法启动,它给出“错误 1053 服务没有响应及时的启动或控制请求”。可能是什么原因?
    • 很难说。如果您有源代码并将服务编译为作为控制台应用程序运行,您应该会收到更详细的错误消息。
    • 你能告诉我使用数据缓存存储需要什么数据库结构
    猜你喜欢
    • 2015-03-04
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    相关资源
    最近更新 更多