C# 简单喷油器-确保控制器在生产中具有无参数公共构造函数

C# 简单喷油器-确保控制器在生产中具有无参数公共构造函数,c#,asp.net,angularjs,dependency-injection,simple-injector,C#,Asp.net,Angularjs,Dependency Injection,Simple Injector,我陷入了一种奇怪的境地。我遵循的是洋葱架构,我的架构是这样的: 1-Core - Domain Classes - Repository Interfaces - Service Interfaces 2-Infrastructure - Data - Dependency Injection // Here I am using Simple Injector as dependency injection - Repository

我陷入了一种奇怪的境地。我遵循的是洋葱架构,我的架构是这样的:

1-Core
     - Domain Classes
     - Repository Interfaces
     - Service Interfaces
2-Infrastructure
     - Data
     - Dependency Injection // Here I am using Simple Injector as dependency injection
     - Repository Interfaces Implementation
     - Service Interfaces Implementation
3-WebApi
     - Web Api Project
4-WebClient
     - My AngularJs App
5-Test
     - Test Project
依赖项注入:

[assembly: PreApplicationStartMethod(typeof(IocConfig), "RegisterDependencies")]
namespace Infrastructure.DependencyResolution
{
    public class IocConfig
    {
        public static void RegisterDependencies()
        {
            var container = new Container();

            container.RegisterWebApiRequest<IRepositoryAsync<Category>, Repository<Category>>();
            container.RegisterWebApiRequest<ICategoryService, CategoryService>();
            container.RegisterWebApiRequest<IDataContextAsync>(() => new MyContext());
            container.Verify();
            GlobalConfiguration.Configuration.DependencyResolver =
            new SimpleInjectorWebApiDependencyResolver(container);

        }
    }
}
public class HomeController : ApiController
{
    private readonly ICategoryService _categoryService;
    public HomeController(ICategoryService categoryService)
    {
        _categoryService = categoryService;
    }
}
在我的
本地IIS上,一切都很正常。但现在我已将此应用程序发布到生产服务器,现在它给了我以下错误:

{“消息”:“发生错误”。,“异常消息”:“错误” 尝试创建“HomeController”类型的控制器时发生。 确保控制器具有无参数的公用程序 构造函数“,“exceptionType”:“System.InvalidOperationException”,“stackTrace”: 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor控制器描述符,类型 控制器类型)\r\n位于 System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage 请求)\r\n在 System.Web.Http.Dispatcher.HttpControllerDispatcher.d_u1.MoveNext(),“innerException”:{“message”:“An” 出现错误。“,“exceptionMessage”:“类型” “JetAdz.WebApi.Controllers.HomeController”没有默认值 构造函数“,”异常类型“:”System.ArgumentException“,”堆栈跟踪“:” 位于System.Linq.Expressions.Expression.New(类型)\r\n位于 System.Web.Http.Internal.TypeActivator.Create[TBase](类型 instanceType)\r\n位于 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceActivator(HttpRequestMessage 请求,类型controllerType,Func`1&activator)\r\n位于 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor控制器描述符,类型 控制器类型“}”


您没有为WebApi注册正确的DependencyResolver。根据和,应该这样做

public static void Register(HttpConfiguration config)
{
    var container = new Container();

    container.RegisterWebApiRequest<IRepositoryAsync<Category>, Repository<Category>>();
    container.RegisterWebApiRequest<ICategoryService, CategoryService>();
    container.RegisterWebApiRequest<IDataContextAsync>(() => new MyContext());
    container.Verify();

    config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);

    // Other Web API configuration not shown.
}
公共静态无效寄存器(HttpConfiguration配置)
{
var container=新容器();
container.RegisterWebApiRequest();
container.RegisterWebApiRequest();
RegisterWebApiRequest(()=>newmyContext());
container.Verify();
config.DependencyResolver=新的SimpleInjectorWebApidencyResolver(容器);
//未显示其他Web API配置。
}

您显示的配置是针对MVC依赖项注入的(您可能也需要它)。

请查看抛出异常的内部异常。它包含描述为什么会发生这种情况的详细信息

这里有很多问题。您应该确保在容器中显式注册所有根类型。控制器是根类型,因为它们是直接解析的(不依赖于它们,但它们有依赖关系)。如果未显式注册它们,则在调用
Verify()
时,容器无法检查是否可以创建它们。您可以通过调用以下命令来注册控制器:

container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
这在中进行了描述

执行此操作后,您可能会在启动应用程序时直接看到
Verify()
方法失败,在本例中,您会收到一条非常详细的消息,解释出现了什么问题

从内部异常可以看到Web API的
DefaultHttpControllerActivator.GetInstanceActivator
方法正在调用
TypeActivator.Create(Type)
。只有在调用
request.GetDependencyScope().GetService(controllerType)
返回
null
时,才会发生这种情况。但是,如果将
SimpleInjectorWebAPI依赖解析程序
连接到Web API管道中,这通常是不会发生的。这是因为当请求解析
IHttpController
实现时,
SimpleInjectorWebApiDependencyResolver
将永远不会返回
null
。相反,当无法解析控制器时,它将抛出异常

因此,我认为这表明应用程序中存在绑定重定向问题。这意味着SimpleInjector.Integration.WebApi.dll所引用的
IHttpController
版本与您的应用程序所使用的版本不同。绑定重定向旨在解决此问题,因此请确保应用程序具有正确的绑定。对于System.Web.Http.dll,它看起来是这样的(但请注意,您可能还需要其他绑定):


... 
通常,绑定由NuGet package manager管理,但它无法定期这样做


当绑定重定向问题修复后,您将看到内部异常包含来自Simple Injector的信息,这些信息与调用
Verify()

时看到的信息相同。我使用spring XML文件将变量注入到我的类中。在我的例子中,当我创建一个新的控制器时,它是一个复制/粘贴错误

因此,虽然这与OP问题并不完全相关,但它会收到相同的错误消息,并且我会帮助其他人

我复制了(尖括号改为方括号):

当我需要的是:

[object id="className" type="Project.ClassName" scope="request"]
    [property name="OtherClassName" ref="otherclassName"/]
[/object]
请注意属性而不是构造函数参数


因为我的类没有寻找参数的构造函数。

对我来说,只是我忘了添加
SimpleInjectorInitializer.Initialize()到我的
应用程序\u Start()


现在,我通常在
App_Start
文件夹中创建一个
SimpleInjectorInitializer
类,在该类中我执行
container.Verify()
GlobalConfiguration.Configuration.DependencyResolver=新的SimpleInjectorWebApidencyResolver(container)呼叫;在我调用了我的
GetInitializeContainer()
方法进行所有类型注册等之后。

这似乎很有趣,但是为什么它在我的本地iis上运行得很好。可能是因为它在经典模式下运行。感谢您的努力和支持
[object id="className" type="Project.ClassName" scope="request"]
    [property name="OtherClassName" ref="otherclassName"/]
[/object]