[英]Autofac Cannot resolve parameter serviceScopeFactory of constructor 'Void
[英]WebApi - Autofac cannot resolve parameter HttpRequestMessage
我有一個RegisterHttpRequestMessage
不適用於我的問題,並且無法弄清楚我在做什么錯。 特別是當我嘗試手動解析接受HttpMessageRequest作為參數的服務時。
我正在使用模塊在構建器中注冊組件,當前我在主Web項目中的模塊如下所示:
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterHttpRequestMessage(GlobalConfiguration.Configuration);
builder.RegisterType<SourceSystemViewModel>().AsImplementedInterfaces().InstancePerRequest();
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly())
.Where(t => t.Name.EndsWith("ViewModelValidator"))
.AsImplementedInterfaces()
.PropertiesAutowired();
// Etc etc etc
SourceSystemViewModel
當前非常簡單,如下所示:
public interface ISourceSystemViewModel
{
SourceSystem Value { get; }
}
public class SourceSystemViewModel : ISourceSystemViewModel
{
public SourceSystemViewModel(HttpRequestMessage request)
{
Value = request.Headers.GetSourceSystem();
}
public SourceSystem Value { get; }
}
GetSourceSystem只是一種擴展方法,可以提取頭值。 我嘗試過使用InstancePerRequest
和不使用InstancePerRequest
注冊SourceSystemViewModel
,但這沒有什么不同。 當autofac嘗試解析ISourceSystemViewModal
(並最終解析HttpRequestMessage
)時,將拋出以下內容:
Autofac.dll中發生類型為'Autofac.Core.Registration.ComponentNotRegisteredException'的異常,但未在用戶代碼中處理
附加信息:所請求的服務'System.Net.Http.HttpRequestMessage'尚未注冊。 為避免此異常,請注冊一個組件以提供服務,使用IsRegistered()檢查服務注冊,或使用ResolveOptional()方法解決可選的依賴項。
使用autofac 3.5(webapi dll引用為autofac.webapi2 3.4)。
任何想法表示贊賞!
筆記
遇到這些問題時,我將添加所有發現...
更新1
我看了一下RegisterHttpRequestMessage
工作方式,確實為HttpConfiguration
添加了一個名為CurrentRequestHandler
的消息處理程序。 當我的請求進入時,我可以看到此消息處理程序仍然存在。 因此,該方法似乎可以完成預期的工作,只是沒有為我解決請求消息...
更新2
我注意到,雖然在控制器的上下文中,因此可以訪問HttpRequestMessage
我可以解析兩個對象。 像這樣:
ILifetimeScope requestLifetimeScope = Request.GetDependencyScope().GetRequestLifetimeScope();
var h = requestLifetimeScope.Resolve<HttpRequestMessage>();
var sourceSystemViewModel = requestLifetimeScope.Resolve<ISourceSystemViewModel>();
更新3
重要的是要注意,我正在手動嘗試解析將HttpMessageRequest作為注入參數的服務。 例如,這對我來說失敗了:
using (var httpRequestScope = IocProxy.Container.Context.BeginLifetimeScope("AutofacWebRequest"))
{
var sourceSystemViewModel = httpRequestScope.Resolve<ISourceSystemViewModel>();
}
我有同樣的問題,並根據SO我能得到它的工作
public class NLoggerTraceWriterModule : Module
{
private HttpConfiguration _config;
public NLoggerTraceWriterModule(HttpConfiguration config)
{
this._config = config;
}
protected override void Load(ContainerBuilder builder)
{
builder.RegisterInstance(this._config).As<HttpConfiguration>();
builder.Register(c =>
c.Resolve<HttpConfiguration>()
.Services
.GetService(typeof(ITraceWriter)) as ITraceWriter)
.As<ITraceWriter>();
}
}
將該模塊注冊為
// Call RegisterHttpRequestMessage to add the feature.
builder.RegisterHttpRequestMessage(config);
builder.RegisterModule(new Helper.Logging.NLoggerTraceWriterModule(config));
即使這不是OP的問題,這還是另一種解決方案,因為這是目前Google唯一的結果, "The requested service System.Net.Http.HttpRequestMessage' has not been registered."
如果創建了HttpConfiguration
實例,請確保將其傳遞給注冊功能。
就我而言,這可以通過更改以下方法解決:
builder.RegisterHttpRequestMessage(GlobalConfiguration.Configuration);
對此:
builder.RegisterHttpRequestMessage(Startup.HttpConfiguration);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.