Web API控制器仅包含空构造函数



让我描述站点。

我使用Web API和在控制器类中定义我的HTTP动词,我注意到我无法创建构造函数。事实上,如果我添加一个空的构造函数,那就是Oke,但是当我修改此构造函数时,它不是。当我尝试与Postman发布到Controller类内的方法

中时,它给我以下错误
{
"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)rn   bij System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)rn   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)rn   bij System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)rn   bij System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)rn   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类的构造函数

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

创建没有构造函数的类时,编译器会自动为其创建无参数构造函数。当您使用构造函数(有或没有参数(创建类时,您的编译器不会自动为班级创建无对讲机构造函数,因为已经存在一个。

对于解决方案,您只需要使用参数添加构造函数旁边的无参数构造函数:

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) { }
}

最新更新