2015-10-20 19 views
5

私は電子商取引サイトで、Asp.Net 5とMVC6のオニオンアーキテクチャ(OA)に準拠しているため、レイヤ間の結合が緩やかです。私はまた、MVCプロジェクトではなく、独自のアセンブリでスタートアップコードをデカップリングしたいと思っています。Asp.Net 5 MVC 6 Startup.cs Beta8でのデカップリング

ベータ7 hereのように、Startup.csをクラスライブラリ(ブートストラップ)に移動するのは非常に簡単でした。上記のアプローチを使用した1つの興味深い事実は、MVCプロジェクトからBootstrapperアセンブリを参照する必要がなかったことです。実行時にIISExpressでホストされ、アセンブリスキャンにより、Microsoft.AspNet.Hosting.iniファイルに記載されているBootstrapperアセンブリが見つかりました。これは、依存性注入をフックアップするためにはインフラ、サービスなどのような他のすべてのプロジェクトへの参照を持っていますglobal.json

{ 
    "projects": [ "Source/Projects","Source/Bootstrapper" ], 
    "sdk": { 
     "architecture": "x64", 
     "runtime": "clr", 
     "version": "1.0.0-beta7" 
    } 
} 

ブートストラッププロジェクトの場所を指定することで可能でした。

MVCプロジェクトでBootstrapperプロジェクトを参照しない理由は、MVCプロジェクトから直接インフラストラクチャコードにアクセスすることを避けるためです。今朝ベータ8にアップグレードするまで、これはうまくいきました。

ホスティングモデルは、私が

global.json

{ 
    "projects": [ "Source/Projects","Source/Bootstrapper" ], 
    "sdk": { 
     "architecture": "x64", 
     "runtime": "clr", 
     "version": "1.0.0-beta8" 
    } 
} 

project.json以下のようにglobal.jsonとproject.jsonファイルをリファクタリングしなければならなかった、ケストレルにIISから変更されたよう

{ 
    "dependencies": { 
    "Microsoft.AspNet.IISPlatformHandler": "1.0.0-beta8", 
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-beta8", 
    "....", 
    "....", 
}, 

"commands": { 
    "web": "Microsoft.AspNet.Server.Kestrel" 
    } 
} 

上記の変更を行った後、私は次のエラーを取得開始かかわらず、私はそれがStartupDevelopment 'または「スタートアップ」という名前

内部サーバーエラーのSystem.InvalidOperationException A タイプが アセンブリ「EcommerceMvcApp」で見つけることができなかったのVisual Studioから直接DNXコマンドまたはを使用して実行するかどうか。 Microsoft.AspNet.Hosting.Startup.StartupLoader.FindStartupType Microsoft.AspNet.Hosting.Internal.HostingEngine.EnsureStartup(AT(文字列 startupAssemblyName、IListのdiagnosticMessages))で Microsoft.AspNet.Hosting.Internal.HostingEngine.EnsureApplicationServices(AT Microsoft.AspNet.Hosting.Internal.HostingEngine.BuildApplicationで) ()hereを説明したように、私はウェブコマンドにconfigファイルまたはインライン引数を指定する必要があることが判明

。提案に従った後、私は、アプリケーションと、私は、ファイルまたはアセンブリ 「ブートストラップ」またはその依存関係の1つをロードできませんでした

System.IO.FileNotFoundException下のエラーを取得し始めたこの時間を実行してみました。指定した ファイルが見つかりません。 System.Reflection.RuntimeAssembly。 System.Reflection.RuntimeAssembly.nLoad(のAssemblyNameファイル名、文字列 コードベースで_nLoad(のAssemblyNameファイル名、文字列 コードベース、証拠assemblySecurity、RuntimeAssembly locationHint、 StackCrawlMark & stackMark、のIntPtr pPrivHostBinder、ブール throwOnFileNotFound、ブールforIntrospection、ブール suppressSecurityChecks) System.Reflection.RuntimeAssembly.InternalLoadAssemblyNameで、証拠assemblySecurity、RuntimeAssembly locationHint、 StackCrawlMark & stackMark、のIntPtr pPrivHostBinder、ブール throwOnFileNotFound、ブールforIntrospection、ブール suppressSecurityChecks)(のAssemblyName Microsoft.AspNet.Hosting.StartupでSystem.Reflection.Assembly.Load(のAssemblyName assemblyRef)でassemblyRef、証拠assemblySecurity、RuntimeAssembly reqAssembly、 StackCrawlMark & stackMark、のIntPtr pPrivHostBinder、ブール throwOnFileNotFound、ブールforIntrospection、ブール suppressSecurityChecks) Microsoft.AspNet.Hosting.Internal.HostingEngine.EnsureApplicationServicesでMicrosoft.AspNet.Hosting.Internal.HostingEngine.EnsureStartup()()Microsoft.AspNet.Hostingで で.StartupLoader.FindStartupType(文字列 startupAssemblyName、IListのdiagnosticMessages)。 Internal.HostingEngine.BuildApplication()

solutionでは、MVCプロジェクトのBootstrapperプロジェクトへの参照を追加する必要があります。しかし、それは最初の場所で別々のブートストラップアセンブリを持つという目的を破っています。

なぜ、Beta7でやったように、global.jsonの "projects"で指定されたソースを使ってBootstrapperアセンブリを見つけることができないのですか?またはglobal.jsonを無視した新しいホスティングモデルですか?スタートアップアセンブリの場所を指定する方法はありますか?

アップデート1

ちょうどベータ7で、それはまたMicrosoft.AspNet.Server.WebListenerとMicrosoft.AspNet.Server.Kestrelの両方のための「DNXコマンド」を使用して動作することを強調するためにしたいです。

"commands": { 
     "kestrel": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.Kestrel --server.urls http://localhost:5004 --config wwwroot/Microsoft.AspNet.Hosting.ini", 
     "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5004 --config wwwroot/Microsoft.AspNet.Hosting.ini" 
    } 

ただし、Beta8の両方のサーバーでdnxコマンド(Microsoft.AspNet.Hosting.jsonファイルを使用)が失敗します。誰かがベータ版のIIS Heliosコンポーネントと関係があると思っている人は、そうではありません。アセンブリ参照がベータ8

アップデート2

ここで私はIISExpressを使用してベータ8で実行しようとすると、私が取得スタックトレースがある中で働いて停止した理由を私は次のように困惑しています。 dnx binフォルダにアセンブリがあるかのように見えます。

System.IO.FileNotFoundException:ファイルまたはアセンブリを読み込めませんでした。 'Bootstrapper'またはその依存関係の1つ。指定した ファイルが見つかりません。ファイル名: 'Bootstrapper' at System.Reflection.RuntimeAssembly。 System.Reflection.RuntimeAssembly.nLoad(のAssemblyNameファイル名、文字列 コードベースで_nLoad(のAssemblyNameファイル名、文字列 コードベース、証拠assemblySecurity、RuntimeAssembly locationHint、 StackCrawlMark & stackMark、のIntPtr pPrivHostBinder、ブール throwOnFileNotFound、ブールforIntrospection、ブール suppressSecurityChecks) System.Reflection.RuntimeAssembly.InternalLoadAssemblyNameで、証拠assemblySecurity、RuntimeAssembly locationHint、 StackCrawlMark & stackMark、のIntPtr pPrivHostBinder、ブール throwOnFileNotFound、ブールforIntrospection、ブール suppressSecurityChecks)(のAssemblyName Microsoft.AspNet.Hosting.StartupでSystem.Reflection.Assembly.Load(のAssemblyName assemblyRef)でassemblyRef、証拠assemblySecurity、RuntimeAssembly reqAssembly、 StackCrawlMark & stackMark、のIntPtr pPrivHostBinder、ブール throwOnFileNotFound、ブールforIntrospection、ブール suppressSecurityChecks) Microsoft.AspNet.Hosting.Internal.HostingEngine.EnsureApplicationServicesでMicrosoft.AspNet.Hosting.Internal.HostingEngine.EnsureStartup()()Microsoft.AspNetで で.StartupLoader.FindStartupType(文字列 startupAssemblyName、IList`1 diagnosticMessages)。 Hosting.Internal.HostingEngine.BuildApplication()

===バインド前の状態情報=== LOG:DisplayName =ブートストラップ(部分)WRN: アセンブリの部分バインディング情報が提供されました:WRN:アセンブリ名:ブートストラップ|ドメインID:1 WRN: 部分バインドは、アセンブリ表示名の一部のみが である場合に発生します。 WRN:バインダーが不正確な アセンブリをロードすることがあります。 WRN:アセンブリの完全指定テキスト を提供することが推奨されます。この名前は、単純名、 バージョン、カルチャ、および公開鍵トークンで構成されています。 WRN:詳細については http://go.microsoft.com/fwlink/?LinkId=109270のホワイトペーパーを参照し、この問題の一般的な解決方法については を参照してください。ログ:Appbase = ファイル:/// C:/Users/sshassan/.dnx/runtimes/dnx-clr-win-x86.1.0.0-beta8/bin/ ログ:初期PrivatePath = NULL呼び出しアセンブリ:(不明)。 === LOG:このバインドは、デフォルトのロードコンテキストで開始します。 LOG:アプリケーション構成ファイルが見つかりません。 LOG:ホスト構成ファイルを使用する:LOG: C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ config \ machine.configのマシン構成ファイルを使用する。 LOG:現時点でポリシーが参照に適用されていません(プライベート、 カスタム、部分、または場所ベースのアセンブリバインド)。ログ:新しいURL をダウンロードしようとしています ファイル:/// C:/Users/sshassan/.dnx/runtimes/dnx-clr-win-x86.1.0.0-beta8/bin/Bootstrapper.DLL。 ログ:新しいURLのダウンロードを試みています ファイル:/// C:/Users/sshassan/.dnx/runtimes/dnx-clr-win-x86.1.0.0-beta8/bin/Bootstrapper/Bootstrapper.DLL。 ログ:新しいURLのダウンロードを試みています ファイル:/// C:/Users/sshassan/.dnx/runtimes/dnx-clr-win-x86.1.0.0-beta8/bin/Bootstrapper.EXE。 ログ:新しいURLのダウンロードを試みています ファイル:/// C:/Users/sshassan/.dnx/runtimes/dnx-clr-win-x86.1.0.0-beta8/bin/Bootstrapper/Bootstrapper.EXE。

おそらく、私がDNU実行する場合、公開し、それが動作するIISの下でそれをホストするが、それは私がそれを

+0

本当にこれを[aspnet/Homeリポジトリ](https://github.com/aspnet/Home/)に持って行き、そこに助けを求めるべきです。 – poke

+0

あなたはそれを達成できますか? RC1がリリースされたので、もっと簡単かもしれません。 – Franco

+0

まだ試したことがありません。私はスタートアップファイルの新しいエントリーポイント、すなわちMainメソッドで可能かもしれないと思います。私はそれを行くだろう –

答えて

0

ホスティング設定ファイルのフォーマットは、INIから変更し、私は変更を加えるたびに、公開しなければならないことを意味しJsonに試してみてください:

{ 
    "Hosting:Application": "Bootstrapper", 
} 

this issueを参照してください。

+1

はい、私はすでにhosting.jsonファイルを使用しています。問題はホスティングファイルではありません。私の質問の2番目のエラーメッセージは、ブートストラップアセンブリを探していることを示しています。しかし、それはそれを見つけることができません –

1

同様の問題が発生しました。 UIレイヤーからInfraestructureレイヤー(私たちは非常に厳しい)への参照を作成したくないようですが、依存関係の解決を行うことさえできません。

おそらくレイトバインド(私はそれについて話を聞いたことがあります)を使用することが可能ですが、this articleを読むべきだと思います。基本的には、Composition Rootは再利用できないと言われています。アプリケーションごとに1つずつ(UI.Web用、UI.Console用など)が1つ必要です。

これは、UI.WebにDI解像度があることについての私の質問にも反応しますが、別のUIが必要です。コンソール(答え:コンソールでanoter DI解像度を作成することをお勧めします。独自の解像度コンソールアプリケーションの実際の動作に関する依存関係)。

この問題を明確にするのに役立つことを希望します。

+0

おかげでフランコ。 +1は優れた記事を参照してください。私は同じ話題で同じ男がしばらく前に[記事](http://blog.ploeh.dk/2011/07/28/CompositionRoot/)を読んでいます。それ以来、私はその規則に従っています。つまり、CRを作っていますエントリポイントに可能な限り近づけます。私はMakに完全に同意し、私のソリューションの3つのアプリケーションは独自のCRを持っています。しかし、私の問題は、CRを再利用するのではなく、アプリケーションのエントリーポイントからデカップリングすることです。これにより、UIレイヤーはDIコンテナから独立し、UI、インフラストラクチャ、およびサービスレイヤー間の一時的な依存関係になります。 –

+0

Pre Asp.Net 5では、アセンブリレベル[PreApplicationStartMethod](http://haacked.com/archive/2010/05/16/three-hidden-extensibility-gems-in-asp)を使用してCRのデカップリングを簡単に達成できました。 -net-4.aspx /)属性です。それはBeta7でも働いていましたが、私はGitHubでも質問しました。David Fowlerによると、beta7のバグのために働いていました。 [ここ](https://github.com/aspnet/Hosting/issues/433#issuecomment-150122556)の質問を参照してください。おそらく、Davidが提案したように、私はカスタムアセンブリローダーを書く必要があります。しかし、この機能は引数をdnxに渡すことによって提供されている可能性があります –

+0

まあ、私はあなたのポイントを理解しています。しかし、今私はそのようなことを切り離すことに価値を見いださない。私は単に私の依存関係解決**がすべての私の層(UI、サービス、Infraestructure)について知っていると言うことができます。これは、私のアプリケーションがUI、実際のアプリケーションに貼り付けられ、永続化メカニズムがコンソールアプリケーションと異なる可能性があることを意味します。それが同じであれば、私はDIをもう一度書いていきますが、異なっています。私はあなたにポイントを伝えることができるかどうかわからない – Franco

関連する問題