gpt4 book ai didi

c# - 使用简单注入(inject)器注入(inject) MVC Controller 构造函数时未注册参数

转载 作者:太空狗 更新时间:2023-10-29 20:20:37 24 4
gpt4 key购买 nike

我遇到了一个看似非常基本的问题,使用简单注入(inject)器将依赖项注入(inject) MVC Controller 。我是 Simple Injector 的新手,之前使用过 StructureMap。

MVC的版本是4.5,是从NuGet安装的最新版本的Simple Injector。

我在查看 HomeController 的/Index View 时遇到的错误是:

The constructor of the type HomeController contains the parameter of type IContext with name 'context' that is not registered. Please ensure IContext is registered in the container, or change the constructor of HomeController.

Controller 是这样的:

public class HomeController : Controller
{
public HomeController(IContext context) { }

public ActionResult Index() { }
}

IContext 只是一个简单的接口(interface):

public interface IContext
{
}

具体的 IContext 实现也很简单,只是常规 DbContext 的包装器。

public class DbContext : System.Data.Entity.DbContext, IContext
{

}

有关信息,IContext 接口(interface)位于与 DbContext 实现不同的 VS 项目/程序集中。这些由 MVC 项目引用。

我的 Global.asax.cs 中有以下内容:

protected void Application_Start()
{
var container = new Container();

container.Register<IContext, DbContext>();

container.RegisterMvcControllers(System.Reflection.Assembly.GetExecutingAssembly());

container.RegisterMvcAttributeFilterProvider();

container.Verify();

DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));

// Regular MVC startup
AreaRegistration.RegisterAllAreas();

WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}

这是堆栈跟踪:

[ActivationException: The constructor of the type HomeController contains the parameter of type IContext with name 'context' that is not registered. Please ensure IContext is registered in the container, or change the constructor of HomeController.]
SimpleInjector.Advanced.DefaultConstructorInjectionBehavior.BuildParameterExpression(ParameterInfo parameter) +229
SimpleInjector.Registration.BuildParameterExpressionFor(ParameterInfo parameter) +43
SimpleInjector.Registration.BuildConstructorParameters(ConstructorInfo constructor) +170
SimpleInjector.Registration.BuildNewExpression(Type serviceType, Type implementationType) +62
SimpleInjector.Registration.BuildTransientExpression() +85
SimpleInjector.Registration.BuildExpression(InstanceProducer producer) +62
SimpleInjector.InstanceProducer.BuildExpressionInternal() +42
System.Lazy`1.CreateValue() +14443208
System.Lazy`1.LazyInitValue() +476
SimpleInjector.InstanceProducer.BuildExpression() +159

[ActivationException: The registered delegate for type HomeController threw an exception. The constructor of the type HomeController contains the parameter of type IContext with name 'context' that is not registered. Please ensure IContext is registered in the container, or change the constructor of HomeController.]
SimpleInjector.InstanceProducer.BuildExpression() +257
SimpleInjector.InstanceProducer.VerifyExpressionBuilding() +53

[InvalidOperationException: The configuration is invalid. Creating the instance for type HomeController failed. The registered delegate for type HomeController threw an exception. The constructor of the type HomeController contains the parameter of type IContext with name 'context' that is not registered. Please ensure IContext is registered in the container, or change the constructor of HomeController.]
SimpleInjector.InstanceProducer.VerifyExpressionBuilding() +161
SimpleInjector.Container.VerifyIfAllExpressionsCanBeBuilt(InstanceProducer[] producersToVerify) +45
SimpleInjector.Container.VerifyIfAllExpressionsCanBeBuilt() +166
SimpleInjector.Container.Verify() +39
MyMvcApp.App_Start.SimpleInjectorInitializer.Initialize() +216

[TargetInvocationException: Exception has been thrown by the target of an invocation.]
System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) +0
System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) +229
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +193
System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) +35
WebActivator.BaseActivationMethodAttribute.InvokeMethod() +341
WebActivator.ActivationManager.RunActivationMethods() +534
WebActivator.ActivationManager.RunPostStartMethods() +38
WebActivator.StartMethodCallingModule.Init(HttpApplication context) +159
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +530
System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +304
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +404
System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +475

[HttpException (0x80004005): Exception has been thrown by the target of an invocation.]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +12889028
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +159
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +12730121

我不知道为什么它不能正常工作,因为所有代码都按照 Simple Injector 快速入门指南。

最佳答案

确保 HomeController 引用的 IContext 实际上与您在 中注册的 IContext 类型相同应用程序_开始。很可能,这是一种不同的类型。在注册中的 IContextHomeController 中的 IContext 中对 Visual Studio 进行“goto 定义”,您可以确认 Visual Studio跳转到同一个文件。

要检查的另一件事是代码中显示的 Container 实例是否是在 MVC 中注册的实际(且唯一)容器。在您的应用程序中搜索任何其他 new Container 注册。

当您的配置实际上包含具有相同名称的不同类型时,较新版本的 Simple Injector 实际上会警告您一个非常具体的错误,因此使用 Simple Injector 应该很容易检测到这些问题。当由于不正确的动态程序集加载而发生这种情况时,异常消息 is even more specific .

关于c# - 使用简单注入(inject)器注入(inject) MVC Controller 构造函数时未注册参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22009761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com