2017-06-01 57 views
2

任何人都可以解釋我在這裏失蹤了嗎?我創建了一個簡單的應用程序,使用默認的asp.net核心1.1 MVC模板。我正在使用默認的DI容器,除了添加中間件類和DI配置之外,沒有做任何其他更改。中間件和Scoped/Singleton對象

問題是,當使用對象的Scoped或Singleton實例時,同一個對象不會在兩個位置注入。

下面的代碼:

public class MyMiddleware 
{ 
    private readonly RequestDelegate _next; 

    public MyMiddleware(RequestDelegate next) 
    { 
     _next = next; 
    } 

    public async Task Invoke(HttpContext httpContext, MyInstance myInstance) 
    { 
     httpContext.Items["myInstance"] = myInstance; 
     myInstance.MyProperty = 99; 

     await _next(httpContext); 
    } 
} 

public class MyInstance 
{ 
    public int MyProperty { get; set; } 
} 

在ConfigureServices我:

services.AddSingleton<MyInstance>(); 

在配置我:

app.UseMiddleware<MyMiddleware>(); 

和家庭控制器指數方法,我有:

public IActionResult Index(MyInstance myInstance) 
{ 
    if (ReferenceEquals(HttpContext.Items["myInstance"], myInstance)) 
     Debug.WriteLine("Equal!"); 
    else 
     Debug.WriteLine("Not Equal!"); 

    return View(); 
} 

無論我是否使用Scoped或Singleton生命週期,它總是打印「不等於!」。另外,通過調試,我已經驗證的MyProperty在HomeController索引中爲0。

顯然,我在這裏錯過了一些東西。它也在.NET Core 2.0 Preview1中做同樣的事情。

此處有任何建議嗎?

編輯:

至於另一項測試,我設置MyProperty在HomeControll /指數,並在第二次刷新值回0再一個不同的值,所以很明顯這似乎是創建一個新的瞬態的實例每時間。

回答

0

好的,是的。我錯過了一些東西。大聲笑。

我會留下這個警告故事,因爲我學到了一些東西。

首先,我很愚蠢地只給UseSingletion提供實例,我應該將接口映射到實例。但是,這仍然不一定是問題的一部分。只是我應該做的事情。

其次,我將IMyInstance傳遞給Index方法,該方法被視爲模型綁定對象,而不是注入。我需要注入一個構造函數,我應該注意到,但沒有。

一旦我解決了這些問題,一切工作正常。

哦,我學到的是MVC不會注入到動作方法中,但是它會注入其他類型的方法(如中間件調用)。

我認爲令人驚訝的部分是模型綁定器在沒有任何綁定的情況下實際實例化了MyInstance。我似乎記得,如果MVC模型綁定器的至少一個屬性出現在FormsCollection中,它將僅實例化一個對象。

如果我實際上使用了接口映射方法,問題就會變得非常明顯,因爲它會產生關於接口的模型綁定錯誤。因此,這個警示的故事。

相關問題