繁体   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