从数据库更新实体后出错:没有为此对象定义无参数构造函数
本文关键字:对象 定义 构造函数 参数 更新 数据库 实体 出错 | 更新日期: 2023-09-27 18:26:42
有人见过这样的东西吗:
我已经接管了对现有解决方案的编码,该解决方案一直运行得很好,直到我向数据库中添加了一个新表,然后从数据库中更新了实体。一切似乎都很好,直到运行时,我突然在家庭控制器上出现了这个错误:
No parameterless constructor defined for this object.
从堆栈跟踪。。。
[InvalidOperationException: An error occurred when trying to create a controller of type 'Response.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor.]
问题是,家庭控制器没有改变。它从来没有一个无参数的构造函数。此外,所有对它的引用都带有参数,所以我甚至不确定它在哪里/为什么认为它需要一个无参数的构造函数。
真的很困惑。
如果我需要添加更多内容来帮助解决此问题,请告诉我。我有点在黑暗中拍摄,因为我以前从未见过这样的东西。
编辑:
这是构造函数:
public HomeController([Dependency("ImageUploadPath")] string imageUploadPath,
IPermissions permissions,
IResponseEntitiesFactory responseEntities,
IResponseWebConfiguration responseWebConfiguration,
ILog log)
: base(imageUploadPath, permissions, responseWebConfiguration)
{
_responseEntitiesFactory = responseEntities;
_responseWebConfiguration = responseWebConfiguration;
_log = log;
}
编辑#2:
该解决方案使用Unity DI框架。这是IUnityContainer。。。
public class Bootstrapper
{
public static IUnityContainer BootstrapUnity()
{
IUnityContainer container = new UnityContainer();
container.RegisterInstance(LogManager.GetLogger(typeof(Bootstrapper)));
var log = container.Resolve<ILog>();
container.RegisterType<IResponseQueueConfiguration, ResponseQueueConfiguration>();
var configuration = container.Resolve<IResponseQueueConfiguration>();
container.RegisterType<IMessageDispatcherManager, MessageDispatcherManager>();
container.RegisterType<ResponseTimeHelper, ResponseTimeHelper>(new InjectionConstructor(log)); // hint for unity to default to the parameter less constructor (it tries to default to the IResonseEntities version!)
container.RegisterType<IActivityQueue, MSMQActivityQueue>(new InjectionConstructor(configuration.QueueName));
container.RegisterType<IActivityService, LeadActivityService>();
container.RegisterType<IDispositionDiagnosticService, DispositionDiagnosticService>();
container.RegisterType<IHttpPoxService, HttpPoxService>(new InjectionConstructor(configuration.UrbanScienceDispositionService, log));
container.RegisterType<ICreateWorkflowTasksService, CreateWorkflowTasksService>();
container.RegisterType<INewLeadNotifications, NewLeadNotifications>();
container.RegisterType<IResponseEntities, ResponseEntities>(new PerThreadLifetimeManager());
container.RegisterInstance<IResponseEntitiesFactory>(new SimpleResponseEntitiesFactory(() => new ResponseEntities()));
container.RegisterInstance(container.Resolve<IResponseEntitiesFactory>().Create());
container.RegisterType<ITokenReplacementService, TokenReplacementService>();
container.RegisterType<IMessageProcessor, SendEmailMessageProcessor>("sendemail");
container.RegisterType<IMessageProcessor, SendNewLeadNotificationsMessageProcessor>("sendnewleads");
container.RegisterType<ITokenReplacementService, TokenReplacementService>();
container.RegisterType<ISmtpConfiguration, SmtpConfiguration>();
return container;
}
}
现在我没有看到IPermissions
、IResponseWebConfiguration
和imageUploadPath
的注册。要么使用了另一个注册文件,要么它们没有注册。
您可以在上次注册后注册的位置为我提到的每种类型添加container.ResolveType<T>
,并检查是否引发任何异常。您还可以在调试中手动检查容器,查看项目的所有注册,并确定缺少什么。