gpt4 book ai didi

c# - 简单注入(inject)器——确保 Controller 在生产环境中有一个无参数的公共(public)构造函数

转载 作者:太空狗 更新时间:2023-10-29 22:10:32 26 4
gpt4 key购买 nike

我遇到了一个奇怪的情况。我遵循 Onion Architecture,我的架构是这样的:

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

依赖注入(inject):

[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);

}
}
}

网络 API 项目:

public class HomeController : ApiController
{
private readonly ICategoryService _categoryService;
public HomeController(ICategoryService categoryService)
{
_categoryService = categoryService;
}
}

在我的本地 IIS 上一切正常。但是现在我已经将这个应用程序发布到生产服务器,现在它给我以下错误:

{"message":"An error has occurred.","exceptionMessage":"An error occurred when trying to create a controller of type 'HomeController'. Make sure that the controller has a parameterless public constructor.","exceptionType":"System.InvalidOperationException","stackTrace":" at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()","innerException":{"message":"An error has occurred.","exceptionMessage":"Type 'JetAdz.WebApi.Controllers.HomeController' does not have a default constructor","exceptionType":"System.ArgumentException","stackTrace":" at System.Linq.Expressions.Expression.New(Type type)\r\n at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}}

最佳答案

请看一下抛出异常的内部异常。它包含描述发生这种情况的原因的详细信息。

这里有多个问题。您应该确保在容器中显式注册所有根类型。 Controller 是根类型,因为它们是直接解析的(没有什么依赖于它们,但它们有依赖性)。如果您没有显式注册它们,容器将无法在您调用 Verify() 时检查它们是否可以创建。 .您可以通过调用以下命令来注册您的 Controller :

container.RegisterWebApiControllers(GlobalConfiguration.Configuration);

这在 the documentation 中有描述.

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

从内部异常您可以看到 Web API 的 DefaultHttpControllerActivator.GetInstanceOrActivator方法正在调用 TypeActivator.Create<T>(Type) .这仅在调用 request.GetDependencyScope().GetService(controllerType) 时发生返回 null .但是,如果您连接 SimpleInjectorWebApiDependencyResolver,这通常不会发生。进入 Web API 管道。这是因为 SimpleInjectorWebApiDependencyResolver永远不会回来 null当要求解决 IHttpController 时执行。相反,它会在无法解析 Controller 时抛出异常。

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

<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
...
<dependentAssembly>
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35"
culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>

通常绑定(bind)由 NuGet 包管理器管理,但它不会定期这样做。

修复绑定(bind)重定向问题后,您会看到内部异常包含来自 Simple Injector 的信息,与您在调用 Verify() 时看到的信息相同。 .

关于c# - 简单注入(inject)器——确保 Controller 在生产环境中有一个无参数的公共(public)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32168928/

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