Как реализовать пользовательский атрибут для декорирования методов и использования внедрения зависимостей? - PullRequest
0 голосов
/ 28 февраля 2019

Я бы хотел украсить методы, используя такой атрибут:

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.Есть ли способ реализовать атрибут для достижения этого и для обычных методов?

...