【问题标题】:web api controller only contain empty constructor [duplicate]Web api控制器仅包含空构造函数[重复]
【发布时间】:2018-04-24 10:58:24
【问题描述】:

让我描述一下这个位置。

我使用 web api,在我定义 http 动词的控制器类中,我注意到我无法创建构造函数。事实上,如果我添加一个为空的构造函数是可以的,但是当我修改这个构造函数时它不是。当我尝试使用邮递员发布到控制器类中的方法时,它给了我以下错误

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

【问题讨论】:

  • 创建一个空的构造函数并创建你自己的(你必须同时拥有)。
  • 你的类没有无参数构造函数。这在异常消息中已明确说明。
  • 什么是analyticsData 以及它的用途
  • 当我在它旁边创建一个空的构造函数时,它只会使用空构造函数而不是我打算使用的构造函数,但错误会消失。当我的构造函数不为空时,analyticsData 只是接收错误的一个示例。
  • @Bcoded 阅读 Asp.Net Web API 和 DependencyResolver 中的依赖注入。框架无法解决依赖关系,因为您尚未注册它们,这就是它失败的原因。 docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/…

标签: c# api web constructor


【解决方案1】:

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

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

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

【讨论】:

  • 仍然给我一个异常 System.NullReferenceException: of _analyticsData
  • @Bcoded 您需要为您的属性分配一个值data,以确保您使用它,即public DataController() :this("somedefaultvalue") { }。我编辑了我的答案。
  • 致反对者:请评论为什么以及需要改进的地方
猜你喜欢
  • 2013-03-08
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多