2017-04-27 10 views
6

ServiceFilter Startup.csに登録する必要があります。 TypeFilterはMicrosoft.Extensions.DependencyInjection.ObjectFactoryによって挿入されます。フィルターを登録する必要はありません。ServiceFilterとTypeFilter - これらのフィルタの違いは何ですか?

ServiceFilterとTypeFilterを使用する必要があるときは、

+0

ASP.NETのコアドキュメントには、フィルタの詳細な説明が含まれています。あなたはそれをチェックしましたか? –

答えて

5

オクラホマのでdocumentation

  • ServiceFilterは、DIからフィルタのインスタンスを検索します。フィルタータイプを登録しないでServiceFilterを使用すると、例外が発生します。

  • TypeFilterAttributeは、(またIFilterFactoryを実装)ServiceFilterAttributeに非常に類似しているが、そのタイプは、DIコンテナから直接解決されません。代わりに、Microsoft.Extensions.DependencyInjection.ObjectFactoryを使用して型をインスタンス化します。

この違いのため、TypeFilterAttributeを使用して参照されているタイプは、最初のコンテナに登録する必要はありません(彼らはまだ、コンテナによって満たさそれらの依存関係を持つことになります)。

+0

私はそれを知っていますが、ServiceFilterを使うべきときと、Typefilterを使うべきときはまだ分かりません。 – MrChudz

+0

正確に 'Microsoft.Extensions.DependencyInjection.ObjectFactory'とは何ですか?これをコンテナに登録しないとどうしますか? –

0

フィルタにコンテナから解決する必要がある依存関係がある場合は、TypeFilterAttributeを使用してください。それはto perform constructor injectionを許可します。

2

ServiceFilterとTypeFilterの両方は、依存関係注入を使用して構築されます。

thisによるとのtypeFilterが最終的にあなたはコンストラクタを提供することを可能にする自分をパラメータMicrosoft.Extensions.DependencyInjection.ObjectFactoryを使用してインスタンス化される(あなたは、コンストラクタで引数パラメータを参照することができます)。また、あなたが提供していないものも解決します。

public class AttachMetadataAttribute : Attribute, IAsyncActionFilter 
{ 
    public AttachMetadataAttribute(SomeType someValue, ISomeService service) 
     { 
     } 
} 

そして、あなたはこのようなものを使用することができます:

は、だから、このような何かを行うことができますので、ここで最初のパラメータ(someValueの)が提供されますし、サービスによって

[TypeFilter(typeof(AttachMetadataAttribute), 
    IsReusable = true, 
    Order = 10, 
    Arguments = new object[] { someValue})] 

容器によって注入される。

注:注意してください。IsReusable。 trueに設定されていると、注入されたサービスは1回だけ作成されます。

関連する問題