public interface IRequestDatabaseLoggerFactory {
IRequestDatabaseLogger Create(ActionExecutingContext context);
}
public class RequestDatabaseLoggerFactory : IRequestDatabaseLoggerFactory {
public IRequestDatabaseLogger Create(ActionExecutingContext context) {
return new RequestDatabaseLogger(context);
}
}
public class ActionFilter : ActionFilterAttribute
{
public ActionFilter(IRequestDatabaseLoggerFactory factory) {
_factory = factory;
}
private readonly IRequestDatabaseLoggerFactory _factory;
public override void OnActionExecuting(ActionExecutingContext context)
{
var requestDatabaseLogger = _factory.Create(context);
long logId = requestDatabaseLogger.Log();
context.HttpContext.AddCurrentLogId(logId);
base.OnActionExecuting(context);
}
}。私はこれの詳細な例を私のMSDN Article on ASP.NET Core Filtersに示します。関連するソースコードはhereです(ValidateAuthorExistsフィルタを見てください)。
はここで、それはあなたのシナリオでどのように見えるかです:
public class MyFilterAttribute : TypeFilterAttribute
{
public MyFilterAttribute():base(typeof(MyFilterImpl))
{
}
private class MyFilterImpl : IAsyncActionFilter
{
public MyFilterImpl(*inject dependencies here*)
{}
}
}
これは、あなたはまだ基本的なアクションフィルタへの依存性を注入しながら、.NETのコアの属性を使用する方法です。私はDevIQ.comの今後のASP.NET Core Quickstartコースでもこれをカバーします(今月の終わりを見てください)。
属性に役立つ何もしないようにします。属性は[ここ](http://blog.ploeh.dk/2014/06/13/passive-attributes/)および[ここ](https://www.cuttingedge.it/blogs/steven)で説明されているように受動的でなければなりません。 /pivot/entry.php?id=98)。 – Steven
関連:https://stackoverflow.com/a/29916075/264697 – Steven
私はあなたの意味だと思う*避けてください*説明したように、ここに示したように、私は工場の抽象化の使用に対して助言... – ssmith