Autofac将数据注入OWIN Startup类

pet*_*ski 0 c# dependency-injection autofac owin asp.net-web-api2

我一直在寻找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();
Run Code Online (Sandbox Code Playgroud)

在运行时,实例化Startup类时,callstack显示它来自外部代码,而我的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);
     ....
 }
Run Code Online (Sandbox Code Playgroud)

任何想法将不胜感激.谢谢

peteski

UPDATE

我应该补充一点,在尝试Autofac注册和构建之后,我开始执行以下操作来启动OWIN自我主机应用程序:

var webApp = WebApp.Start<Startup>(baseAddress);
Run Code Online (Sandbox Code Playgroud)

通过与朋友的对话,他们建议创建Startup对象并将其传递给WebApp:

var startup = new Startup(origins);
var webApp = WebApp.Start(startup, baseAddress);
Run Code Online (Sandbox Code Playgroud)

在这里,我将这个IEnumerable<string>起源添加到Startup课程的ctor中.这确实有效!但感觉就像使用Autofac处理Startup类所需要的那样.

Tra*_*lig 7

开箱即用Autofac不支持您正在寻找的内容.

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

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

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