【问题标题】:Unity Dependency injection automatically expires after a particular time.. Why?Unity Dependency injection 在特定时间后自动过期.. 为什么?
【发布时间】:2017-03-24 11:59:32
【问题描述】:

我在我的 Web api 2.0 中使用 Microsoft Unity 进行依赖注入。它工作正常;但有时它会引发依赖失败错误。已发布端口和本地项目中的相同问题。我在 DDD 概念中使用存储库模式...我在 unit.config 中的依赖代码如下。

var container = new UnityContainer();

container.RegisterType<ILogger, Log4NetLogger>();
container.RegisterType<NHibernateFactory, NHibernateFactory>();
container.RegisterType<INhibernateUnitOfWork, NHUnitOfWork>();
container.RegisterType(typeof(IRepository<,>), typeof(NHRepository<,>));

container.RegisterTypes(AllClasses.FromLoadedAssemblies(), 
    WithMappings.FromMatchingInterface, 
    WithName.Default, 
    WithLifetime.Hierarchical);

GlobalConfiguration.Configuration.DependencyResolver = 
    new UnityDependencyResolver(container);

我收到以下错误

2017-03-24 09:47:12,426 [12] 错误主要 - System.InvalidOperationException:尝试创建“ProductController”类型的控制器时发生错误。确保控制器有一个无参数的公共构造函数。 ---> Microsoft.Practices.Unity.ResolutionFailedException:依赖项解析失败,类型=“Solver.ERP.WebAPI.HMS.Controllers.V1.Masters.ProductController”,名称=“(无)”。 异常发生时:解决时。

异常是:InvalidOperationException - 当前类型 Solver.ERP.Application.Services.IProductService 是一个接口,无法构造。您是否缺少类型映射?

发生异常时,容器为:

解析 Solver.ERP.WebAPI.HMS.Controllers.V1.Masters.ProductController,(无) 解析构造函数 Solver.ERP.WebAPI.HMS.Controllers.V1.Masters.ProductController(Solver.ERP.Application.Services.IProductService PService, Solver.ERP.Infrastructure.Utility.Logging.ILogger Nlogger) 的参数“PService” 解析 Solver.ERP.Application.Services.IProductService,(无) ---> System.InvalidOperationException:当前类型,Solver.ERP.Application.Services.IProductService,是接口,无法构造。您是否缺少类型映射? 在 Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForAttemptingToConstructInterface(IBuilderContext 上下文) 在 lambda_method(闭包,IBuilderContext) 在 Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.c__DisplayClass1.b__0(IBuilderContext 上下文) 在 Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext 上下文) 在 Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext 上下文) 在 Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext 上下文) 在 Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey) 在 Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext 上下文) 在 lambda_method(闭包,IBuilderContext) 在 Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.c__DisplayClass1.b__0(IBuilderContext 上下文) 在 Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext 上下文) 在 Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext 上下文) 在 Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext 上下文) 在 Microsoft.Practices.Unity.UnityContainer.DoBuildUp(类型 t,现有对象,字符串名称,IEnumerable1 resolverOverrides) --- End of inner exception stack trace --- at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable1 resolverOverrides) 在 Microsoft.Practices.Unity.UnityContainer.Resolve(类型 t,字符串名称,ResolverOverride[] resolverOverrides) 在 Microsoft.Practices.Unity.UnityContainerExtensions.Resolve(IUnityContainer 容器,类型 t,ResolverOverride[] 覆盖) 在 Unity.WebApi.UnityDependencyScope.GetService(类型 serviceType) 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage 请求,类型控制器类型,Func`1& 激活器) 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor 控制器描述符,类型控制器类型) --- 内部异常堆栈跟踪结束 --- 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor 控制器描述符,类型控制器类型) 在 System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage 请求) 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()

以下代码用于将类映射到接口

container.RegisterTypes(AllClasses.FromLoadedAssemblies(), WithMappings.FromMatchingInterface, WithName.Default, WithLifetime.Hierarchical);

【问题讨论】:

  • 错误信息是什么?您还检查过应用程序池没有被回收吗?
  • NHibernateFactory不应该注册到INHibernateFactory吗?
  • 如果没有对错误的详细描述以及可能的堆栈跟踪和其他异常详细信息,没有办法任何人都可以回答这个问题。请向我们提供一个包含所有必需异常详细信息的最小可重现程序。
  • @Steven 已编辑问题。请找出错误。这是记录 log4net 错误
  • 请更新您的问题并显示IProductServiceRegisterType 映射。

标签: c# dependency-injection asp.net-web-api2 unity-container


【解决方案1】:

查看您提供的错误消息。

ERROR Main - System.InvalidOperationException:尝试创建“ProductController”类型的控制器时发生错误。确保控制器有一个无参数的公共构造函数。 --->

这个错误很常见。你错过了实例化你的控制器。

我不确定使用Unityblock 的语法。但我知道CastleWindsor DI 容器。

请在您的班级中添加相应的Unity 配置。

container.Register(Classes.FromThisAssembly()
            .BasedOn(typeof(Controller))
            .If(t => t.Name.EndsWith("Controller"))
            .LifestyleTransient());
             //LifestylePerWebRequest or per thread decide as per your need.

希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    相关资源
    最近更新 更多