Autofac Web API 2 和 Owin 在 StartupConfig 中解析
Autofac Web API 2 and Owin resolve in StartupConfig
我有一个既是 OWIN 又是 Web 的项目 API 2。
我已尽力按照说明进行操作。
在 Configration 方法中 StartupConfig class 我有这个:
// Get our configuration
var config = new HttpConfiguration();
var container = ConfigureInversionOfControl(app, config);
var scope = config.DependencyResolver.GetRequestLifetimeScope();
var serverOptions = ConfigureOAuthTokenGeneration(app, scope);
//** removed for brevity **//
// Cors must be first, or it will not work
app.UseCors(CorsOptions.AllowAll);
// Register the Autofac middleware FIRST. This also adds
// Autofac-injected middleware registered with the container.
app.UseAutofacMiddleware(container);
//app.UseAutofacWebApi(config);
app.UseOAuthAuthorizationServer(serverOptions);
app.UseWebApi(config);
我的 ConfigurInversionOfControl 方法如下所示:
private static IContainer ConfigureInversionOfControl(IAppBuilder app, HttpConfiguration config)
{
// Create our container
var builder = new ContainerBuilder();
// You can register controllers all at once using assembly scanning...
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
// Add our dependencies (Can't use life because this is available to all controllers
builder.RegisterType<UnitOfWork<DatabaseContext>>().As<IUnitOfWork>().InstancePerRequest();
// Register our services
builder.Register(c => new AdvancedEncryptionStandardProvider(ConfigurationManager.AppSettings["rm:key"], ConfigurationManager.AppSettings["rm:secret"])).As<IAdvancedEncryptionStandardProvider>();
builder.RegisterType<LogService>().As<ILogService>();
builder.RegisterType<EmailService>().As<IEmailService>();
builder.RegisterType<RefreshTokenService>().As<IRefreshTokenService>();
// Register our providers
builder.Register(c => new SendGridProvider(c.Resolve<IUnitOfWork>(), c.Resolve<IEmailService>(), ConfigurationManager.AppSettings["SendGridApiKey"])).As<ISendGridProvider>();
builder.RegisterType<LogProvider>().As<ILogProvider>();
builder.RegisterType<RefreshTokenProvider>().As<IAuthenticationTokenProvider>();
builder.RegisterType<OAuthProvider>().As<OAuthProvider>();
// Build
var container = builder.Build();
// Lets Web API know it should locate services using the AutofacWebApiDependencyResolver
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
// Return our container
return container;
}
现在我已经设置好了(我假设是正确的)。如何解决我的 StartupConfig class 中的一项服务?
我需要能够创建 OAuthProvider 和 RefreshTokenProvider 的实例。我试过类似的东西:
// Get our providers
var authProvider = scope.Resolve<OAuthProvider>();
var refreshTokenProvider = scope.Resolve<IAuthenticationTokenProvider>();
// Create our OAuth options
return new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true, // TODO: Remove this line
TokenEndpointPath = new PathString("/oauth/access_token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
AccessTokenFormat = new Business.Authentication.JwtFormat("http://localhost:62668"),
Provider = authProvider,
RefreshTokenProvider = refreshTokenProvider
};
但是当它到达行 var authProvider = scope.Resolve<OAuthProvider>();
时,我收到一条错误消息:
Parameter cannot be null: Parameter name: context
现在我假设上下文尚未创建,所以我假设我的决心做错了什么。
有人可以帮忙吗?
这其实很简单。
我需要更改范围:
var scope = config.DependencyResolver.GetRequestLifetimeScope();
到
var scope = config.DependencyResolver.GetRootLifetimeScope();
我假设是因为 "request" 在 StartupConfig class 中不可用。
无论如何,改变这个解决了我的问题。
我有一个既是 OWIN 又是 Web 的项目 API 2。 我已尽力按照说明进行操作。 在 Configration 方法中 StartupConfig class 我有这个:
// Get our configuration
var config = new HttpConfiguration();
var container = ConfigureInversionOfControl(app, config);
var scope = config.DependencyResolver.GetRequestLifetimeScope();
var serverOptions = ConfigureOAuthTokenGeneration(app, scope);
//** removed for brevity **//
// Cors must be first, or it will not work
app.UseCors(CorsOptions.AllowAll);
// Register the Autofac middleware FIRST. This also adds
// Autofac-injected middleware registered with the container.
app.UseAutofacMiddleware(container);
//app.UseAutofacWebApi(config);
app.UseOAuthAuthorizationServer(serverOptions);
app.UseWebApi(config);
我的 ConfigurInversionOfControl 方法如下所示:
private static IContainer ConfigureInversionOfControl(IAppBuilder app, HttpConfiguration config)
{
// Create our container
var builder = new ContainerBuilder();
// You can register controllers all at once using assembly scanning...
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
// Add our dependencies (Can't use life because this is available to all controllers
builder.RegisterType<UnitOfWork<DatabaseContext>>().As<IUnitOfWork>().InstancePerRequest();
// Register our services
builder.Register(c => new AdvancedEncryptionStandardProvider(ConfigurationManager.AppSettings["rm:key"], ConfigurationManager.AppSettings["rm:secret"])).As<IAdvancedEncryptionStandardProvider>();
builder.RegisterType<LogService>().As<ILogService>();
builder.RegisterType<EmailService>().As<IEmailService>();
builder.RegisterType<RefreshTokenService>().As<IRefreshTokenService>();
// Register our providers
builder.Register(c => new SendGridProvider(c.Resolve<IUnitOfWork>(), c.Resolve<IEmailService>(), ConfigurationManager.AppSettings["SendGridApiKey"])).As<ISendGridProvider>();
builder.RegisterType<LogProvider>().As<ILogProvider>();
builder.RegisterType<RefreshTokenProvider>().As<IAuthenticationTokenProvider>();
builder.RegisterType<OAuthProvider>().As<OAuthProvider>();
// Build
var container = builder.Build();
// Lets Web API know it should locate services using the AutofacWebApiDependencyResolver
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
// Return our container
return container;
}
现在我已经设置好了(我假设是正确的)。如何解决我的 StartupConfig class 中的一项服务? 我需要能够创建 OAuthProvider 和 RefreshTokenProvider 的实例。我试过类似的东西:
// Get our providers
var authProvider = scope.Resolve<OAuthProvider>();
var refreshTokenProvider = scope.Resolve<IAuthenticationTokenProvider>();
// Create our OAuth options
return new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true, // TODO: Remove this line
TokenEndpointPath = new PathString("/oauth/access_token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
AccessTokenFormat = new Business.Authentication.JwtFormat("http://localhost:62668"),
Provider = authProvider,
RefreshTokenProvider = refreshTokenProvider
};
但是当它到达行 var authProvider = scope.Resolve<OAuthProvider>();
时,我收到一条错误消息:
Parameter cannot be null: Parameter name: context
现在我假设上下文尚未创建,所以我假设我的决心做错了什么。 有人可以帮忙吗?
这其实很简单。 我需要更改范围:
var scope = config.DependencyResolver.GetRequestLifetimeScope();
到
var scope = config.DependencyResolver.GetRootLifetimeScope();
我假设是因为 "request" 在 StartupConfig class 中不可用。 无论如何,改变这个解决了我的问题。