【问题标题】:Autofac Injection of data into OWIN Startup classAutofac 将数据注入 OWIN 启动类
【发布时间】:2015-11-11 15:39:19
【问题描述】:

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

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

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

我希望能够注册 Startup 类,这样我就可以为 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 类被实例化时,调用堆栈显示它来自外部代码,而我的 Autofac 构建器没有将属性推入。

理想情况下,我希望将我的 Autofac 注册保存在一个地方(Windows 服务类),并将所需的数据注入 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&lt;string&gt; 来源添加到Startup 类的ctor。这确实有效!但感觉就像它使用 Autofac 来处理为 Startup 类提供所需的东西。

【问题讨论】:

    标签: c# dependency-injection asp.net-web-api2 owin autofac


    【解决方案1】:

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

    在 IIS 或其他非自托管环境中,没有用于构建容器然后注入启动类的钩子。这是一个先有鸡还是先有蛋的问题——启动类是你开始构建容器的钩子。

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

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

    【讨论】:

      猜你喜欢
      • 2014-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 2015-06-29
      • 2017-10-27
      相关资源
      最近更新 更多