Мое приложение ASP.NET Core использует наши собственные конвейеры для обработки запросов.Каждый конвейер содержит 1+ блоков, а количество блоков не имеет ограничений.в реальном случае это может быть до 200+ блоков, конвейер будет проходить через все блоки в последовательности из конфигурации, например:
Pipeline<DoActionsPipeline>().AddBlock<DoActionAddUserBlock>().AddBlock<DoActionAddUserToRoleBlock>()...
Как в примере выше (только в качестве примера), и существует 200+ блоки, сконфигурированные в этом конвейере, блоки могут быть DoActionAddUserBlock
, DoActionAddUserToRoleBlock
, DoActionAddAddressToUserBlock
и так далее.многие действия смешаны в одном конвейере.(Пожалуйста, не спрашивайте, зачем смешивать их, это просто пример, это не имеет значения для моего вопроса.)
Для этого примера, в каждом блоке, мы сначала проверим имя действия, если оно совпадает,затем запустите логику.но это довольно плохо, он должен создать экземпляр всех блоков и пройти их все, чтобы выполнить запрос.
Вот пример кода, не очень хороший, но он показывает мою боль:
public class DoActionAddUserBlock : BaseBlock<User, User, Context>
{
public override User Execute(User arg, Context context)
{
if (context.ActionName != "AddUser")
{
return arg;
}
return AddUser(arg);
}
protected User AddUser(User user)
{
return user;
}
}
public abstract class BaseBlock<TArg, TResult, TContext>
{
public abstract TResult Execute(TArg arg, TContext context);
}
public class Context
{
public string ActionName { get; set; }
}
public class User
{
}
Я хочу избежать создания блоков по условиям, я думаю, что это должно быть на уровне конфигурации конвейера.как я могу достичь этого?Атрибуты?или что-то другое.
[Condition("Action==AddUser")] // or [Action("AddUser")] // or [TypeOfArg("User")]
public class DoActionAddUserBlock : BaseBlock<User, User, Context>
{
public override User Execute(User arg, Context context)
{
return AddUser(arg);
}
//...
}