Я бы хотел украсить методы, используя такой атрибут:
public class MyAttribute : Attribute
{
public MyAttribute(Dependency1 dependency1, ..., DependencyN dependencyN)
{...}
public void OnMethodExecution(MethodDelegate next)
{
// do stuff...
next();
// do stuff...
}
public async void OnMethodExecutionAsync(MethodDelegate next)
{
// do stuff...
await next();
// do stuff...
}
}
public class MyClass
{
[MyAttribute]
public void DoStuff()
{...}
[MyAttribute]
private void DoSomePrivateStuff()
{...}
}
Конечно, я мог бы связать классы декораторов для каждого класса, но это привело бы к множеству дублирующегося кода.И мне пришлось обнародовать частные методы, которые я хочу украсить.То, как мы это реализовали, еще страшнее.Код декорации находится в классе, который внедряется во все другие классы, и вызовы метода передаются методу-декоратору следующим образом:
var resuitl = await _myDecorator.Decorate(async () => await DoStuff(someParameters));
В точности то, что я не хочу видеть в моем логическом коде работы.
Я наткнулся на ActionFilterAttribute
, который на самом деле уже делает то, что я хочу.Можно даже использовать внедрение зависимостей с [ServiceFilter(typeof(MyActionAttribute))]
.Но, к сожалению, это работает только с действиями MVC.Есть ли способ реализовать атрибут для достижения этого и для обычных методов?