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]