Ваша реализация IActionModelConvention
будет запущена только один раз при запуске.Apply
будет вызываться один раз для каждого действия.Чтобы использовать ISomeService
внутри функции Apply
, вы можете передать ее в качестве аргумента конструктора.Ваш класс Contains2RoutesAttribute
не обязательно должен быть атрибутом или реализацией IFilterFactory
, как вы подтвердили в комментариях, что он не участвует в конвейере фильтра .Вот пример кода, где я также переименовал класс, чтобы лучше представлять, что он делает (он больше не является атрибутом):
public class Contains2RoutesConvention : IActionModelConvention
{
private readonly ISomeService someService;
public Contains2RoutesConvention(ISomeService someService)
{
this.someService = someService;
}
public void Apply(ActionModel actionModel)
{
someService.DoSomething();
...
}
}
Вы регистрируете это соглашение в Startup.ConfigureServices
, используя что-то вроде этого:
services.AddMvc(options =>
{
options.Conventions.Add(new Contains2RoutesConvention(new SomeService()));
});
Здесь все становится немного интереснее.Вы не можете использовать внедрение зависимостей с конвенцией , поэтому в этом примере я создал экземпляр SomeService
inline при создании Contains2RoutesConvention
.Если вы хотите, чтобы этот экземпляр был синглтоном, который может использоваться в другом месте вашего приложения, вы можете сделать что-то подобное в ConfigureServices
:
var someService = new SomeService();
services.AddMvc(options =>
{
options.Conventions.Add(new Contains2RoutesConvention(someService));
});
services.AddSingleton<ISomeService>(someService);
Конечно, это зависит от того, SomeService
имеет свои собственные зависимости, но если это так, они не могут быть разрешены из контейнера DI, так как это слишком рано в конвейере.