2016-02-29 85 views
5

今天,ASP.NET Core的RC1版本與DNX協同工作。據我瞭解,RC2的主要變化是ASP.NET Core將開始與.NET Core CLI合作。爲什麼從DNX遷移到.NET CLI需要更改代碼?

現在,我們對以下內容產生了疑問:如果DNX和.NET CLI只是工具,爲什麼這種遷移需要更改代碼?

事實上今天有公告Microsoft.AspNetCore.Mvc.Dnx is required to allow Mvc in RC2 to work with Dnx上,我們看到使用ASP.NET MVC的核心與DNX我們需要添加一包多,我們需要改變我們的代碼,使我們擁有對StartupConfigureServices方法致電services.AddMvcDnx();

這使我困惑。我瞭解DNX和.NET Core CLI只是運行.NET Core應用程序的工具。如果這只是工具爲什麼從一個到另一個的遷移需要更改代碼?

回答

8

這使我困惑。我瞭解DNX和.NET Core CLI只是運行.NET Core應用程序的工具。如果這只是工具爲什麼從一個到另一個的遷移需要更改代碼?

DNVM/DNU/DNX不只是工具。 DNX也是運行時間。它負責引導CLR並調用你的應用程序。這也意味着它有很多關於運行時和應用程序的信息,例如依賴關係,環境等。通過可以注入的各種服務將這些信息提供給應用程序,如IRuntimeEnvironment,IApplicationEnvironmentILibraryManager

反過來,MVC有一個叫做IAssemblyProvider的服務。這負責提供MVC應搜索控制器的組件,以及其他內容。此默認實現基於ILibraryManager,它是DNX特定的服務。這意味着當您切換到基於dotnet的運行時時,它將不再運行,而運行時會被包關閉,而不是使用單獨的工具,如DNVM。

爲了解決這個問題,MVC團隊首先開始依靠DNX服務和更新的dotnet替代方案(Microsoft.Extensions.DependencyModel)。你可以看到代碼here。它主要檢查DNX特定的ILibraryManager是否可用,如果不可用,則回退到替代的dotnet-API。

這種方法的問題在於,當大多數人開始將它與dotnet工具和運行時一起使用時,它會在MVC中引入額外的(大多數情況下)冗餘依賴關係(Microsoft.Extensions.PlatformAbstractions.Dnx)。記得; DNX等仍然是測試版的東西,並將由RTM消失。

相反,他們選擇了當前的解決方案;有一個單獨的包,Microsoft.AspNetCore.Mvc.Dnx,其中包含基於DNX的用於MVC的IAssemblyProvider。你可以看到AddMvcDnx方法的作用是here

這意味着少數跟隨預發佈版本的用戶將不得不對他們的代碼進行一些更改,以便仍然在DNX上運行(儘管我將盡快轉移到dotnet上),而新用戶會只需像往常一樣打電話AddMvc

我希望這有一些意義。它可以真正令人困惑:)

5

這不是dotnet cli交換機的DNX,它需要更改代碼。這是RC1到RC2。正如您在rc2 milestone announcements中看到的那樣,34個公告中的31個是關於重大更改。

所有程序包和關聯的名稱空間都已更改,從Microsoft.AspNet.*Microsoft.AspNetCore.*,對於實體框架也是如此。

如果你有一個關於dnx的RC2,然後切換到dotnet cli,除了應用程序如何啓動的方式外,代碼變化不會很多(如果有的話)。

dotnet cli中沒有命令,很可能它們不會回來。對於DOTNET CLI,你需要明確地啓動應用程序與此類似:

public static void Main(string[] args) 
    { 
     var host = new WebHostBuilder() 
        .UseServer("Microsoft.AspNetCore.Server.Kestrel") 
        .UseStartup<Startup>() 
        .Build(); 

     host.Start(); 
    } 

它仍然沒有公佈,所以斷碼變化還是可以預期的。在GitHub的(源和問題)

挖掘鑽頭,我得到了這個位置:

的RC1和早期建立RC2的用於注入IMvcRazorHostICompilationService實現,它不再可用。現在,您可以使用RazorLoadContext,因爲您可以在new package's commit中看到。進一步我們可以看到它的目標是DOTNET5_6這是一個新的名字對象,表示新的platform standard級別(dotnet 5.1等於netstandard 1.0,dotnet54等於1.3,所以dotnet56等於netstandard 1.5)。

此問題here指向過渡到dotnet56/DOTNET5_6

+0

感謝您的答案。我瞭解重命名的事情,也明白啓動應用程序的需要。但是,在今天的公告中,我們甚至會看到「特定的DNX代碼」,如'services.AddMvcDnx()'方法和DNX包裝本身。爲什麼有DNX特定的代碼? – user1620696

+1

「這是RC1到RC2」這顯然是錯誤的。這絕對是從DNX到dotnet的轉變,需要更改代碼。當然,從RC1到RC2需要做很多改變,但問題主要是關於DNX vs. dotnet和「AddMvcDnx」方法。 – khellang