Я пытался выполнить эту статью о том, как внедрить мои зависимости в мой пользовательский LogActionFilter
, но я не могу лгать. Я полностью сбит с толку и нуждаюсь в некоторой помощи в достижении финишной черты (т. Е. Добавление моих зависимостей в мой фильтр настраиваемых действий, а также объяснение того, как это делается. Пока у меня есть это:
IActionFilter:
public interface IActionFilter<TAttribute> where TAttribute : Attribute {
void OnActionExecuting(TAttribute attribute, ActionExecutingContext context);
}
LogActionDecorator:
public class LogActionDecorator<TAttribute> : IActionFilter<TAttribute>
where TAttribute : Attribute {
private readonly IActionFilter<TAttribute> _decoratee;
private readonly IAccountManagementManager _iAccountManagementManager;
public LogActionDecorator(
IActionFilter<TAttribute> decoratee,
IAccountManagementManager iAccountManagementManager) {
this._decoratee = decoratee;
this._iAccountManagementManager = iAccountManagementManager;
}
public void OnActionExecuting(TAttribute attribute, ActionExecutingContext context) {
this._decoratee.OnActionExecuting(attribute, context);
}
}
ActionFilterDispatcher:
public class ActionFilterDispatcher : IActionFilter {
private readonly Func<Type, IEnumerable> _container;
public ActionFilterDispatcher(Func<Type, IEnumerable> container) {
this._container = container;
}
public void OnActionExecuted(ActionExecutedContext filterContext) { }
public void OnActionExecuting(ActionExecutingContext context) {
var descriptor = context.ActionDescriptor;
var attributes = descriptor.ControllerDescriptor.GetCustomAttributes(true)
.Concat(descriptor.GetCustomAttributes(true))
.Cast<Attribute>();
foreach (var attribute in attributes) {
Type filterType = typeof(IActionFilter<>)
.MakeGenericType(attribute.GetType());
IEnumerable filters = this._container.Invoke(filterType);
foreach (dynamic actionFilter in filters) {
actionFilter.OnActionExecuting((dynamic)attribute, context);
}
}
}
}
LogActionFiter:
public class LogActionFilter : IActionFilter<ActionFilterAttribute> {
private readonly IAccountManagementManager _iAccountManagementManager;
public LogActionFilter(IAccountManagementManager iAccountManagementManager) {
_iAccountManagementManager = iAccountManagementManager;
}
public void OnActionExecuting(
ActionFilterAttribute attribute, ActionExecutingContext context) {
var fg = _iAccountManagementManager.ReturnApplicationIDAsync();
}
}
Контроллер:
[LogActionFilter] //Build error LogActionFilter is not an attribute class
public class AccountManagementController : Controller {
public async Task<ActionResult> EndImpersonation() {
//Do stuff
}
}
Может ли кто-нибудь помочь мне внедрить мои зависимости в мой фильтр пользовательских действий, а также объяснить, как это делается? Я иногда очень трудно понять