基于HttpContext的ASP.Net核心DI工厂

时间:2017-05-04 13:24:30

标签: c# dependency-injection asp.net-core

我希望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提供的其他服务吗?

1 个答案:

答案 0 :(得分:-1)

通常你会注册一个&#39;工厂&#39;在您的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");

获取动作名称......