Autofac 将数据注入 OWIN 启动 class

Autofac Injection of data into OWIN Startup class

我已经在 SO 上四处寻找了一段时间,但找不到我的特定问题的答案:

如何使用 Autofac 将数据(通过构造函数或 属性)注入 OWIN 启动 class?

我在 Windows 服务中使用 Autofac,该服务还处理后端服务等的创建,所以我在其中进行所有配置读取和容器构建。

我希望能够注册 Startup class,这样我就可以为 CORS 注入允许的来源,但即使我像这样用 属性 注册对象时也是如此:

var builder = new ContainerBuilder();
// This will actually be read from config.
var origins = new[]
              {
                  "http://localhost",
                  "http://localhost:8082",
              };
builder.Register(c => new Startup(origins));
var container = builder.Build();

在 Startup class 实例化的运行时,调用堆栈显示它来自外部代码,而我的 Autofac 构建器没有将 属性 推入。

理想情况下,我希望将我的 Autofac 注册保存在一个地方(Windows 服务 class),然后将所需的数据注入 Startup,这样我就可以在下面执行类似的操作(其中 allowedOrigins 设置为 属性 或通过构造函数注入)

 public void Configuration(IAppBuilder app)
 {
     var configuration = new HttpConfiguration();
     ...
     var origins = string.Join(",", allowedOrigins);
     var cors = new EnableCorsAttribute(origins, "*", "*") { SupportsCredentials = true };
     configuration.EnableCors(cors);
     ....
 }

如有任何想法,我们将不胜感激。 谢谢

佩特斯基

更新

我应该补充一点,在尝试注册和构建 Autofac 之后,我通过以下方式启动了 OWIN 自托管应用程序:

var webApp = WebApp.Start<Startup>(baseAddress);

在与朋友的交谈中,他们建议创建 Startup 对象并将其传递给 WebApp

var startup = new Startup(origins);
var webApp = WebApp.Start(startup, baseAddress);

在这里,我将 IEnumerable<string> 来源添加到 Startup class 的构造函数中。这确实有效!但感觉就像是使用 Autofac 来处理给 Startup class 它需要的东西。

开箱即用的 Autofac 不支持您正在查找的内容。

在 IIS 或其他非自托管环境中,没有用于构建容器然后注入启动的挂钩 class。这是一个 chicken/egg 问题 - 启动 class 是你开始构建容器的钩子

在自托管环境中,您提到的建议 - 创建启动对象并将其传递到对 WebApp.Start 的调用中 - 是最好的选择。

基本上,在某个时候您将到达应用程序的入口点(通常在 OWIN 中是启动 class),这就是您必须构建容器并成为用于解决和启动问题的引导程序。 Autofac 无法帮助您 - 这取决于您使用的框架(例如 MVC、OWIN、Web API 等)。