2017-02-08 21 views
1

私は、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())); 

多くありがとう。

+0

これらはありません。コンテナに型を正しく登録していない可能性があります。しかし、あなたは 'container.Register'コードを表示していないので、これは単なる推測です。 – Claies

+0

私は動作するはずの.WithServiceDefaultInterfaces()を使用していますが、動作しません。 – Code4Fun

+0

いいえ、@PatrickQuirkが追加された答えを読んだら、 'DefaultInterfaces'を使っていることはあなたが記述している振る舞いを見ている理由です。 'DefaultInterfaces'の代わりに' AllInterfaces'が必要です。 – Claies

答えて

8

インターフェイスとクラスの登録方法は表示されませんが、DefaultInterfacesの規約を使用している可能性があります。

このメソッドは、型名とインターフェイスの名前に基づいてマッチングを実行します。多くの場合、ICustomerRepository/CustomerRepository,IMessageSender/SmsMessageSender,/DefaultNotificationServiceのようなインターフェイスと実装のペアがあることがわかります。これは、DefaultInterfacesメソッドを使用してサービスと一致させたい場合のシナリオです。これは、選択された型によって実装されたすべてのインタフェースを調べ、一致する名前を持つ型のサービスとして使用します。一致する名前は、実装クラスがその名前にインタフェースの名前(Iが前面にない)を含むことを意味します。

は異なる慣習がいくつかありますが、あなただけのAllInterfacesを探していることがあります。

コンポーネントが複数のインターフェースを実装し、それらのすべてのためのサービスとしてそれを使用したい、使用をWithService.AllInterfaces()メソッド。

関連する問題