2017-05-04 68 views
-1

我希望ASP.Net Core IoC容器根據當前顯示的視圖提供接口的實現。我想通過提供工廠方法,我應該可以在運行時做到這一點。在Startup.cs我已經添加下列註冊:基於HttpContext的ASP.Net核心DI工廠

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使用其他一些服務?

+0

你試過用請求的URL?在執行控制器操作並返回查看結果之前,我們無法知道將顯示哪個視圖。在那時,所有的依賴關係必須已經解決。 – juunas

+0

@juunas我對此很陌生:如何獲得請求URL? 'context.Request'似乎沒有'URL'屬性呢? –

+0

有一個'Path'屬性。 – juunas

回答

-1

通常你會在你的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 
     ); 

如果使用剃刀得到的意見名,或

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

拿到動作名稱...