簡體   English   中英

Autofac:如何傳遞參數以在剃須刀頁面中注冊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM