[英]Autofac: How to pass parameters to register in a razor page
我正在將HttpClient注入到Razor Page。 HttpClient需要三個參數,用戶名,密碼和serverAddress。 注冊期間,我提供了serverAddress。
builder.RegisterType<HttpClient>().As<IHttpClient>()
.WithParameter(new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(string) &&
pi.Name == "serverAddress",
(pi, ctx) => "https://server.address.com"));
但是,我只能在用戶登錄Razor頁面后提供用戶名和密碼。 如何將用戶名和密碼傳遞給HttpClient注冊?
約翰的回答解決了我的問題。 現在,我有一個后續問題。 一次,我從Razor頁面傳遞了參數,如何使其他類依賴於HttpClient自動獲取用戶信息? 所以現在看起來像這樣
builder.RegisterType<HttpClient>().As<IHttpClient>()
.WithParameter(new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(string) &&
pi.Name == "serverAddress",
(pi, ctx) => "https://server.address.com"));
builder.Register(HttpClientFactory)
.As<Func<string, string, IHttpClient>>();
builder.RegisterType<Bamboo>().As<IBamboo>();
Bamboo依賴IHttpClient與Bamboo服務器通信。
對於問題的第二部分,我相信我可以為Bamboo類創建一個構造函數,並使其采用用戶名和密碼這兩個參數。 然后,我可以創建一個Func <>並將其注冊到Bamboo類。 但是,我很好奇我是否可以更新HttpClient中的信息並使其他類依賴於它,以自動獲取用戶信息。
有幾種方法可以根據客戶憑據的確切來源而定,但是最簡單,最靈活的選擇可能只是注入某種形式的工廠,以便在運行時使用。 這可以通過自定義工廠類來完成,但是如果您想在不依賴於Autofac的情況下提供對HttpClient的依賴性的最大靈活性,則可以使用Func<>
來做到這一點,如下所示:
private static Func<string, string, IHttpClient> GetHttpClientFactory(IComponentContext c)
{
var context = c.Resolve<IComponentContext>();
return (u, p) => context.Resolve<IHttpClient>(new NamedParameter("username", u), new NamedParameter("password", p));
}
...
builder.RegisterType<HttpClient>()
.As<IHttpClient>()
.WithParameter(new NamedParameter("serverAddress", "https://server.address.com"));
builder.Register(GetHttpClientFactory)
.As<Func<string, string, IHttpClient>>();
您的用法可能如下所示:
public class Page
{
private readonly Func<string, string, IHttpClient> _httpClientFactory;
public Page(Func<string, string, IHttpClient> httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
public void DoHttpStuff()
{
// extract the user http credentials from the logged-in identity here / handle cases where they're not available:
var user = "SomeUser";
var password = "SomePassword";
var client = _httpClientFactory(user, password);
// use the client
}
}
您可以采取多種方法嘗試在Autofac注冊中嘗試從用戶上下文中讀取http憑據,但是如果上述情況適用於您的情況,它可能只會增加很多不必要的復雜性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.