C# 将对象传递给 Owin 主机中的 ApiController

C# Pass objects to ApiController in Owin host

我有一个 Windows 服务,可以在计时器滴答时做一些事情。现在我需要向该服务添加一个 API 端点以执行几乎相同的操作,但按需进行。在我的服务中,我有两个助手实例 classes:

LithiumUtility lu;
MarketoUtility mu;

为了托管我的端点,我使用 Microsoft.AspNet.WebApi.OwinSelfHost 包。正如所有教程中所见,我以 IDisposable _server = WebApp.Start<Startup>(url: baseAddress); 开头。 Startup class 也没什么特别的。

我的端点定义如下class:

public class MarketoController : ApiController{}

所以,有没有办法将我的 mulu 传递给 MarketoController。我认为它应该通过构造函数完成,但是 MarketoController 没有在任何地方明确引用,我什至不确定它是如何创建的。

这是使用asp.net dependency injection

实现的

总结:在 Startup.ConfigureServices 中调用 services.AddScoped<LithiumUtility> 连接 asp.net 管道以了解如何创建构造函数依赖项的实例,所以你是正确的,控制器的构造函数是正确的指定这些依赖项的地方。,

经过大量搜索,我无法在 "How can I use a concrete instance of some class" 上找到答案。至少不用安装 10 个额外的包和写 100 行代码。

所以我采用了这种肮脏的方法:

我创建了这个 class:

   struct UtilityClasses
{
    public class1 c1 { get; set; }
    public class2 c2 { get; set; }

    public static UtilityClasses uc { get; set; }
    public UtilityClasses(class1 c1, class2 c2)
    {
        this.c1 = c1;
        this.c2 = c2;
    }
}

在启动服务器IDisposable _server = WebApp.Start<Startup>(url: baseAddress)的行附近,我调用

        UtilityClasses uc = new UtilityClasses(c1, c2);
        UtilityClasses.uc = uc;

然后从我的控制器调用

    private class1 c1;
    private class2 c2;


    public MarketoController()
    {
        c1 = UtilityClasses.uc.c1;
        c2 = UtilityClasses.uc.c2;
    }

据我所知,这不是一个好主意,但它解决了我的问题。