让我来描述一下这个作品。
我使用web api,在我定义我的http动词的控制器类中,我注意到我无法创建构造函数。事实上,如果我添加一个空的构造函数,它是oke但是当我修改这个构造函数时它不是。当我尝试使用postman发布到控制器类中的方法
时,它给出了以下错误{
"Message": "An error has occurred.",
"ExceptionMessage": "An error occurred when trying to create a controller of type 'DataController'. Make sure that the controller has a parameterless public constructor.",
"ExceptionType": "System.InvalidOperationException",
"StackTrace": " bij System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n bij System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n bij System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()",
"InnerException": {
"Message": "An error has occurred.",
"ExceptionMessage": "Type Chatbot.Controller.DataController heeft geen standaardconstructor",
"ExceptionType": "System.ArgumentException",
"StackTrace": " bij System.Linq.Expressions.Expression.New(Type type)\r\n bij System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n bij System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n bij System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"
}
}
控制器类
public class DataController : ApiController {
public string data { get; set; }
public DataController(string analyticsData) {
data = analyticsData;
}
public void Post([FromBody] dynamic data) {
_analyticsData.InsertCredentials("fdf", data, "dfdf");
如何实现将非空构造函数添加到控制器类而不会导致此错误的目标?
[编辑]我想要这个是因为以下原因:
private AnalyticsData _analyticsData;
public CredentialsController(AnalyticsData analyticsData) {
_analyticsData = analyticsData;
}
//acces the following method send data to database
_analyticsData.InsertCredentials("fdf", "fdd", "dfdf");
我想从构造函数中访问此方法但是如果构造函数不为空,我已经收到此错误。就像我说的那样,当我在它旁边添加一个空构造函数时,它将不会再收到错误但是找不到_analyticsData,因为这只能在第二个构造函数中使用
[编辑] 我现在正在将Unity用于DI 这是我在WebApiConfig中添加的行
container.RegisterType<IAnalyticsData, AnalyticsData>(new HierarchicalLifetimeManager());
我用其他类和接口测试了这个并且它可以工作。但它不起作用 当例如AnalyticsData的类在其中有一个构造函数时。所以 这仅在我从AnalyticsData类
中删除构造函数时才有效AnalyticsData类的构造函数
public AnalyticsData(ResourceFile file, ResourceFile creationFile) {
var exists = file.Exists();
_connection = SQLite.Open(file);
if (!exists && creationFile.Exists()) {
SQLite.Execute(_connection, creationFile.GetText());
}
}
需要构造函数来加载当前的sqlite数据库
AnalyticsData = new AnalyticsData(new ResourceFile(Settings.String("DatabaseLocation")), Resources.GetFolder("data").GetFile("create.sql"));
我现在收到的唯一问题是我需要使用没有它我不能使用的构造函数,因为那样我就不能再与数据库建立连接了。
我是否需要做更多的事情才增加这条线?
container.RegisterType<IAnalyticsData, AnalyticsData>(new HierarchicalLifetimeManager());
答案 0 :(得分:0)
当您创建没有构造函数的类时,编译器会自动为其创建无参数构造函数。 当您使用构造函数(带或不带参数)创建类时,编译器不会再自动为该类创建一个paremeterless构造函数,因为已存在一个。
对于您的解决方案,您只需要在构造函数旁边添加无参数构造函数和参数:
public class DataController : ApiController {
public string data { get; set; }
public DataController() : this("somedefaultvalue") { } //calls the parameter constructor with "somedefaultvalue"
public DataController(string analyticsData) {
data = analyticsData;
}
//other code
}
查看区别的示例:
static void Main()
{
var decaultConstr = new IOwnNothing(); //valid
var customConst = new IOwnAParamConstructor(); // invalid
var customConst2 = new IOwnAParamConstructor(6); //valid
var privateConstr = new IOwnAPrivateParamConstructor(); //no constructor available
}
private class IOwnNothing
{
}
private class IOwnAParamConstructor
{
public IOwnAParamConstructor(int a) { }
}
private class IOwnAPrivateParamConstructor
{
private IOwnAPrivateParamConstructor(int a) { }
}