Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# web api控制器仅包含空构造函数_C#_Api_Web_Constructor - Fatal编程技术网

C# web api控制器仅包含空构造函数

C# web api控制器仅包含空构造函数,c#,api,web,constructor,C#,Api,Web,Constructor,让我描述一下情况 我使用web api,在定义http谓词的控制器类中,我注意到我无法创建构造函数。事实上,如果我添加了一个空的构造函数,它是OK的,但是当我修改这个构造函数时,它不是。当我试图用postman发布到控制器类内的方法时,它给出了以下错误 { "Message": "An error has occurred.", "ExceptionMessage": "An error occurred when trying to create a controller of type 'D

让我描述一下情况

我使用web api,在定义http谓词的控制器类中,我注意到我无法创建构造函数。事实上,如果我添加了一个空的构造函数,它是OK的,但是当我修改这个构造函数时,它不是。当我试图用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)"
}
如何实现向控制器类添加非空构造函数而不导致此错误的目标

[编辑]我之所以要这样做,是因为以下原因:

    private  AnalyticsData _analyticsData;

    public CredentialsController(AnalyticsData analyticsData) {
        _analyticsData = analyticsData;
    }

//acces the following method send data to database
_analyticsData.InsertCredentials("fdf", "fdd", "dfdf");
我想从构造函数中访问此方法,但是如果我的构造函数不是空的,我已经收到此错误。就像我说的,当我在它旁边添加一个空构造函数时,它将不再接收错误,但是无法找到分析数据,因为这只在第二个构造函数中可用

[编辑] 我现在使用Unity来进行DI 这是我在WebApiConfig中添加的行

container.RegisterType<IAnalyticsData, AnalyticsData>(new HierarchicalLifetimeManager());
加载当前sqlite数据库需要构造函数

AnalyticsData = new AnalyticsData(new ResourceFile(Settings.String("DatabaseLocation")), Resources.GetFolder("data").GetFile("create.sql"));
我现在遇到的唯一问题是,我需要使用没有构造函数就无法使用的构造函数,因为这样我就无法再与数据库建立连接

除了添加这一行,我还需要做些什么吗

container.RegisterType<IAnalyticsData, AnalyticsData>(new HierarchicalLifetimeManager());
container.RegisterType(新的层次结构CallifetimeManager());

当您创建一个没有构造函数的类时,编译器会自动为它创建一个无参数构造函数。 当您使用构造函数(带参数或不带参数)创建类时,编译器不再自动为该类创建无参数构造函数,因为已经存在一个无参数构造函数

对于您的解决方案,您只需将无参数构造函数添加到带参数的构造函数旁边:

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

创建一个空构造函数并创建您自己的构造函数(必须两者都有)。您的类没有无参数构造函数。异常消息中明确说明了这一点。什么是
analyticsData
以及如何使用它当我在旁边创建一个空构造函数时,它将只使用空构造函数,而不是我想要使用的构造函数,但错误将消失。analyticsData只是当我有一个不是空的构造函数时收到错误的一个例子。@b代码读取Asp.Net Web API和DependencyResolver中的依赖项注入。框架无法解决依赖关系,因为您尚未注册它们,这就是它失败的原因。仍然给我一个异常System.NullReferenceException:of_analyticsData@Bcoded如果使用属性
数据
,则需要为其指定一个值,即
公共数据控制器():this(“somedefaultvalue”){}
。我编辑了我的答案。对失望的选民:请评论为什么以及改进什么
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) { }
}