簡體   English   中英

基於HttpContext的ASP.Net Core DI工廠

[英]ASP.Net Core DI Factory Based on HttpContext

我希望 ASP.Net Core IoC 容器根據當前顯示的視圖提供接口的實現。 我認為我應該能夠通過提供工廠方法在運行時做到這一點。 Startup.cs我添加了以下注冊:

services.AddTransient<IMyInterface>(serviceProvider => 
{
    var context = serviceProvider.GetRequiredService<IHttpContextAccessor>().HttpContext;

    //Need to switch on current view somehow?
    switch(context.??????){
        case ???:
             return new MyImplementationOne();
        case ???:
             return new MyImplementationTwo():

    }

}

如何使用HttpContext根據顯示的當前視圖進行切換? 或者,我應該使用通過serviceProvider提供的其他服務嗎?

通常你會在你的 DI 容器中注冊一個“工廠”,例如 IWhateverServiceFactory...

這將有一個方法,它接受視圖名稱(您可以從 RouteContext 獲取)並返回相關實現。 通過這種方式,您可以輕松更改關於哪種實現的邏輯,例如,如果在將來的某個時候您想要使用通用實現。

public interface IWhateverServiceFactory{
    IService GetService(String currentViewName);
}

public class DefaultWhateverServiceFactory : IWhateverServiceFactory{
    IService GetService(String currentViewName){
        switch(currentViewName){
        case ???:
             return new MyImplementationOne();
        case ???:
             return new MyImplementationTwo():
        }
    }
}

RouteContext 對你不起作用,你可以使用類似的東西;

System.IO.Path.GetFileNameWithoutExtension(
            ((RazorView)html.ViewContext.View).ViewPath
        );

如果您使用 Razor 來獲取視圖名稱,或者

Html.ViewContext.RouteData.GetRequiredString("action");

獲取動作名稱...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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