私は、ASP.NET MVCアプリケーションで新しいHangFireジョブを作成しようとしたときに、この面白いシナリオに気付きました。Castle.Windsor - 名前はなぜインターフェイスに似ている必要がありますか?
// this is the interface for the HangFire job.
public interface ICsvExportService
{
void ExportCsvToEmail();
}
// this is the implementation of the above interface.
public class ExportService : ICsvExportService
{
// code goes here.
}
RecurringJob.RemoveIfExists("My CSV exports");
RecurringJob.AddOrUpdate<ICsvExportService>(
"Send CSV exports",
x => x.ExportCsvToEmail(),
Cron.Daily(8));
私はローカルでこれをテストしようとしていましたが、私は下のエラーを得た:スロー
例外:HangFire.Core.dll で「Castle.MicroKernel.ComponentNotFoundException」サービスをサポートするためのないコンポーネントをICsvExportServiceが見つかりました。
別のソリューションを試してみたところ、ファイル名をExportServiceからCsvExportServiceに変更して、魔法が発生しました。出来た!
DIコンテナに実際の実装クラスを認識させるために、なぜインタフェースと同じ名前を使用する必要があるのか説明できますか? .NET 4.5 Castle.Windsorバージョンは、.NET 4.5
ための3.3.0であるため
Castle.Coreのバージョンは3.3.3です登録のためのコードは以下の見つけることができます:
container.Register(
Classes.FromThisAssembly()
.Where(type => type.Name.EndsWith("Service"))
.WithServiceDefaultInterfaces()
.Configure(c => c.LifestyleTransient()));
多くありがとう。
これらはありません。コンテナに型を正しく登録していない可能性があります。しかし、あなたは 'container.Register'コードを表示していないので、これは単なる推測です。 – Claies
私は動作するはずの.WithServiceDefaultInterfaces()を使用していますが、動作しません。 – Code4Fun
いいえ、@PatrickQuirkが追加された答えを読んだら、 'DefaultInterfaces'を使っていることはあなたが記述している振る舞いを見ている理由です。 'DefaultInterfaces'の代わりに' AllInterfaces'が必要です。 – Claies