4

奇妙なエラーがあります。DLL を bin フォルダーにアップロードすると、サイトが機能します。

ただし、しばらく放置した後 (または共有ホスト コントロール パネルから Web サイトの再起動をトリガーした後)

次のエラーが表示されます

The requested service 'Nop.Core.Data.DataSettings' has not been registered. To avoid  this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.


[ComponentNotRegisteredException: The requested service 'Nop.Core.Data.DataSettings'  has not been registered. To avoid this exception, either register a component to provide the service, check for service registration using IsRegistered(), or use the ResolveOptional() method to resolve an optional dependency.]
   Autofac.ResolutionExtensions.ResolveService(IComponentContext context, Service service, IEnumerable`1 parameters) +231
   Autofac.ResolutionExtensions.Resolve(IComponentContext context, IEnumerable`1 parameters) +118
   Autofac.ResolutionExtensions.Resolve(IComponentContext context) +75
   Nop.Core.Infrastructure.DependencyManagement.ContainerManager.Resolve(String key) +156
   Nop.Core.Infrastructure.NopEngine.Resolve() +110
   Nop.Data.EfStartUpTask.Execute() +94
   Nop.Core.Infrastructure.NopEngine.RunStartupTasks() +806
   Nop.Core.Infrastructure.NopEngine.Initialize(NopConfig config) +90
   Nop.Web.MvcApplication.Application_Start() +494[/i]

誰でもこれを修正する方法について何か考えがありますか?

ありがとう

4

2 に答える 2

7

アプリの再起動により、登録されていない型を解決しようとするものが発生しているようです。スタック トレースは、ある種のスタートアップ タスクが実行中であり、そのタスクが type を解決しようとしていることを示していますNop.Core.Data.DataSettings

まず、Nop.Core.Data.DataSettings型が Autofac に登録されている場所を探します。コードのどこかに、次のような行が表示されるはずです...

builder.RegisterType<DataSettings>();

つまり、DataSettings型は に登録されている必要がありAutofac.ContainerBuilderます。その行がどこにも存在しない場合は、タイプが登録されるように追加する必要があります。Autofac は、登録されていない型を「自動的に」解決するだけではありません。AnyConcreteTypeNotAlreadyRegisteredSource(または、 Autofac で を登録することもできますが、通常はやり過ぎです。)

その行が見つからない場合は、追加する必要があります。場所はアプリケーションによって異なりますが、Autofac に登録されている他の場所のブロックが表示されるはずです。おそらく、これも配置するのに適した場所です。

DataSettingsが既に登録されている場合は、アプリケーションの再起動で起動アクションが常に同じ順序で実行されるとは限らないか、常に同じ起動アクションが実行されるとは限らないことを意味します。HttpModuleこの種のことは、複数のワーカー プロセスを適切に処理しない、またはスレッドを適切に処理しない、アプリの起動時に実行されるコード ( など) がある場合に発生する可能性があります。

もう 1 つの考えられる (しかしありそうもない) ケースは、アプリケーションで実行されている 2 つの Autofac コンテナーがありDataSettings、それらの 1 つで実行されているが、もう 1 つは実行されていない場合です。これは本当に特殊なケースですが、可能です。

次に、スタック トレースに沿ってすべてのコードを確認します。オブジェクトを解決しようとしているものを把握しDataSettingsます。直接解決されない場合があります。解決されている他の何かへのコンストラクターの依存関係である可能性があります。それを理解するには、コードを詳しく調べる必要があります。

いずれにせよ、これはAutofac の問題ではなく、アプリの起動の問題のようです。Autofac は登録を「失う」だけではありません。登録されていないものを解決しようとしていると不平を言っている場合は、登録されていません。

例外メッセージは、それをデバッグするために知っておく必要があるすべてを伝えています- 解決が行われている場所、探しているもの... アプリのコードをクラックして開き、スタック トレースに示されている実際の実行パスを確認する必要があります。何が、いつ、なぜ解決されたのかを確認して、修正方法を見つけてください。

于 2013-04-01T15:48:59.573 に答える