2016-08-31 21 views
7

Benim ASP.NET CORE uygulamada her yerde yapıcı tabanlı bağımlılık enjeksiyon kullanmak ve de benim eylem filtrelerinde bağımlılıkları çözümlemek gerekir: Ben ICustomService koyarsanızASP.NET CORE'da Bağımlılık Enjeksiyonu ile Eylem Filtreleri nasıl kullanılır?

[MyAttribute(Limit = 10)] 
public IActionResult() 
{ 
    ... 

:

Sonra
public class MyAttribute : ActionFilterAttribute 
{ 
    public int Limit { get; set; } // some custom parameters passed from Action 
    private ICustomService CustomService { get; } // this must be resolved 

    public MyAttribute() 
    { 
    } 

    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) 
    { 
     // my code 
     ... 

     await next(); 
    } 
} 

Denetleyici'deki kurucu, sonra projemi derleyemiyorum. Peki, eylem filtresinde arayüz örneklerini almayı nasıl anlarım?

+0

Özelleştiricinin özellik kümesini de yazılabilir, böylece yazılabilir de olabilir mi? ve kurucuda parametre olarak ICustomService ekle? –

+1

[ASP.Net Çekirdeği (MVC 6) - Eylem Filtresi'ne Enjekte hizmeti] 'nin olası kopyası (http://stackoverflow.com/questions/36109052/asp-net-core-mvc-6-inject-service-into-action -filtre) – gilmishal

+0

Olası çoğaltılabilir [Bir eylem filtresine asp.net?](http://stackoverflow.com/questions/39181390/how-do-i-add-a-parameter-to adresinde nasıl parametre ekleyebilirim? -as-eylem-süzgeci-asp-net) –

cevap

8

Servis Bulucu modelinden kaçınmak istiyorsanız, TypeFilter numaralı bir kurucu enjeksiyonu kullanarak DI'yi kullanabilirsiniz.

Denetleyiciniz kullanım

[TypeFilter(typeof(MyActionFilterAttribute), Arguments = new object[] {10})] 
public IActionResult() NiceAction 
{ 
    ... 
} 

yılında

Ve ActionFilterAttribute artık bir servis sağlayıcı örneğine erişmek için gerek yoktur.

public class MyActionFilterAttribute : ActionFilterAttribute 
{ 
    public int Limit { get; set; } // some custom parameters passed from Action 
    private ICustomService CustomService { get; } // this must be resolved 

    public MyActionFilterAttribute(ICustomService service, int limit) 
    { 
     CustomService = service; 
     Limit = limit; 
    } 

    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) 
    { 
     await next(); 
    } 
} 

Benim için açıklama [TypeFilter(typeof(MyActionFilterAttribute), Arguments = new object[] {10})] garip görünüyor. [MyActionFilter(Limit = 10)] gibi daha okunabilir bir açıklama almak için filtrenizin TypeFilterAttribute'dan miras alması gerekir. Benim cevabım How do I add a parameter to an action filter in asp.net? bu yaklaşım için bir örnek gösteriyor.

+0

Ayrıca, uyumsuzluğa gereksinim duyarsanız, 'IActionFilter' yerine 'IAsyncActionFilter' kullanabilirsiniz. –

1

Sen Service Locator kullanabilirsiniz:

public void OnActionExecuting(ActionExecutingContext actionContext) 
{ 
    var service = actionContext.HttpContext.RequestServices.GetService<IService>(); 
} 

Eğer yapıcı enjeksiyon kullanımını TypeFilter kullanmak istiyorsanız. Bkz. How do I add a parameter to an action filter in asp.net?

İlgili konular