问题
我使用Unity作为IoC,一开始很好用,但是随着添加更多的功能,想要确定错误变得越来越困难,因为Unity提供的错误只是错误的症状,而不是实际错误:
"Message":"An error has occurred.","ExceptionMessage":"An error occurred
when trying to create a controller of type 'MyController'. Make sure that the
controller has a parameterless public
constructor.","ExceptionType":"System.InvalidOperationException"
背景
我有一个MVC Web Api控制器,它依赖于一个Manager实例(来自domain):
public class MyController : ApiController
{
private IMyManager MyManager { get; set; }
public MyController(IMyManager myManager)
{
this.MyManager = myManager;
}
...
}
上述错误发生的原因是IMyManager的IoC映射失败。由于它失败了,我没有参数,这意味着MyController使用无参数构造函数调用,但由于它不存在(也不应该存在),我得到了上述错误。
我尝试过的方法: 所以,我得到的错误不是“真正”的错误。显而易见的是,确保每个新实现在IoC下注册,我检查过了,它们是注册的。我手动执行此操作以保持可管理性(多么讽刺!)。 我这样做:
container.RegisterType<IMyManager, MyManager>();
但这不是问题所在。
我做的一个修复是解决了循环依赖。我改变了所有涉及的构造函数和方法,使用属性值而不是实例。我检查了所有涉及的类,不再存在循环依赖。
然而,问题仍然存在。
问题
我该怎么办才能找到实际的问题?手动检查依赖关系太过繁琐,因为结构是一个复杂的深层依赖网。随着应用程序的成熟,情况会变得更加严重。
或者,如果Unity始终模糊这些消息(无法修复),是否有其他替代品提供有价值的错误信息?
更新
根据请求,以下是完整的错误消息(尽管我认为堆栈跟踪并不是很有用):
{"Message":"An error has occurred.","ExceptionMessage":"An error occurred when trying to create a controller of type 'MyController'. 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)
at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"Type 'MyProject.Web.Api.Controllers.MyController' does not have a default constructor","ExceptionType":"System.ArgumentException","StackTrace":" at System.Linq.Expressions.Expression.New(Type type)
at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}}
更新2
我深入挖掘并检查了所有依赖项(它们非常庞大),但是一切都已正确注册和加载。也没有任何循环依赖关系,因此据我所知,一切“应该”正常工作。既然它没有,我得出结论是发生了一些错误,但没有被抛出。