2015-09-02 111 views
0

我想在vNext中重新創建HttpContext.Current,但我遇到了這個問題。如何從DI系統獲取實例?

至今代碼:

public class CurrentContext 
    { 
     public IHttpContextAccessor ctx { get; private set; } 

     public CurrentContext(IHttpContextAccessor accessor) 
     { 
      ctx = accessor; 
     } 
    } 

services.AddTransient<CurrentContext>(); 

我想用:

public static class UserFactory 
{ 
    public static void SetCurrentUser(User u) 
    { 
     //tryed to get the context but GetService returns null 
     IHttpContextAccessor _context = ((CurrentContext)CallContextServiceLocator.Locator.ServiceProvider.GetService(serviceType: typeof(CurrentContext))).ctx; 
     //add the user to the Session 
    } 
} 

如何我現在得到的CurrentContext實例在項目的任何地方?

+0

可能的重複[如何使用IHttpContextAccessor實現UserFactory](http://stackoverflow.com/questions/32316180/how-to-implement-a-userfactory-using-ihttpcontextaccessor) – janhartmann

回答

1

我不使用vNext DI系統,但我相信您應該爲您的CurrentContext定義一個接口,例如,

public interface IContextProvider { 
    IHttpContextAccessor GetContext(); 
} 

然後用

public class CurrentContextProvider : IContextProvider 
{ 
    private readonly IHttpContextAccessor _context; 

    public CurrentContextProvider(IHttpContextAccessor accessor) 
    { 
     _context = accessor; 
    } 

    public IHttpContextAccessor GetContext() { 
     return _context; 
    } 
} 

和電線

services.AddScoped<IContextProvider, CurrentContextProvider>(); 

但如果你打算只使用的背景下,爲什麼不乾脆直接取決於IHttpContextAccessor - 你需要它?

+0

你說使用它在哪裏我需要它,但我如何實例化'IHttpContextAccessor'?我在問如何獲得註冊服務的實例? –

+0

你需要哪個實例?你應該依賴於你需要的類的構造函數中的IHttpContextAccessor(或者我的例子中的IContextProvider)。控制器,自定義類和什麼。 – janhartmann

+0

我需要它在靜態上下文中添加/從用戶會話添加/從用戶會話中恢復數據,如用戶名或用戶ID(來自數據庫) –

1

你應該聲明CurrentContext類型的變量在相關類的構造函數:在其它類的構造函數,可能會發生

public class SomeClassThatUsesCurrentContext 
{ 
    private readonly SomeClassThatUsesCurrentContext currentContext; 

    public SomeClassThatUsesCurrentContext(CurrentContext currentContext) 
    { 
     if (currentContext == null) 
      throw new ArgumentNullException("currentContext"); 

     this.currentContext = currentContext; 
    } 
} 

這些類。最後,你通常從DI容器中解析高級類的單個實例。你做的地方叫做composite root

而且,正如@janhartmann所說,通常應該使用接口或抽象類而不是具體類。

+0

我在不同的地方仍然有同樣的問題:我現在如何創建一個'SomeClassThatUsesCurrentContext'的實例? –

+0

通常在ASP.NET MVC應用程序中,您應該實現您的控制器工廠。詳細信息:http://blogs.msdn.com/b/webdev/archive/2014/06/17/dependency-injection-in-asp-net-vnext.aspx –

+0

我需要控制器之外的上下文。我已經在控制器中擁有它了。 –