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类所需要的那样.
开箱即用Autofac不支持您正在寻找的内容.
在IIS或其他非自托管环境中,没有用于构建容器然后注入启动类的钩子.这有点鸡/蛋问题 - 启动类是你开始构建容器的钩子.
在自托管环境中,您提到的建议 - 创建启动对象并将其传递给调用WebApp.Start- 是您最好的选择.
基本上,在某些时候,您将要进入应用程序的入口点(通常在OWIN中,这是启动类),这是您必须构建容器并成为解决和启动的引导程序的点.Autofac无法帮助您 - 这取决于您正在使用的框架(例如,MVC,OWIN,Web API等).