ServiceFilter Startup.csに登録する必要があります。 TypeFilterはMicrosoft.Extensions.DependencyInjection.ObjectFactoryによって挿入されます。フィルターを登録する必要はありません。ServiceFilterとTypeFilter - これらのフィルタの違いは何ですか?
ServiceFilterとTypeFilterを使用する必要があるときは、
ServiceFilter Startup.csに登録する必要があります。 TypeFilterはMicrosoft.Extensions.DependencyInjection.ObjectFactoryによって挿入されます。フィルターを登録する必要はありません。ServiceFilterとTypeFilter - これらのフィルタの違いは何ですか?
ServiceFilterとTypeFilterを使用する必要があるときは、
オクラホマのでdocumentation:
ServiceFilter
は、DIからフィルタのインスタンスを検索します。フィルタータイプを登録しないでServiceFilter
を使用すると、例外が発生します。
TypeFilterAttribute
は、(またIFilterFactoryを実装)ServiceFilterAttribute
に非常に類似しているが、そのタイプは、DIコンテナから直接解決されません。代わりに、Microsoft.Extensions.DependencyInjection.ObjectFactory
を使用して型をインスタンス化します。この違いのため、
TypeFilterAttribute
を使用して参照されているタイプは、最初のコンテナに登録する必要はありません(彼らはまだ、コンテナによって満たさそれらの依存関係を持つことになります)。
私はそれを知っていますが、ServiceFilterを使うべきときと、Typefilterを使うべきときはまだ分かりません。 – MrChudz
正確に 'Microsoft.Extensions.DependencyInjection.ObjectFactory'とは何ですか?これをコンテナに登録しないとどうしますか? –
フィルタにコンテナから解決する必要がある依存関係がある場合は、TypeFilterAttribute
を使用してください。それはto perform constructor injectionを許可します。
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回だけ作成されます。
ASP.NETのコアドキュメントには、フィルタの詳細な説明が含まれています。あなたはそれをチェックしましたか? –