Регистрировать интерфейс только с классом, который напрямую наследует его в Scrutor - PullRequest
0 голосов
/ 27 октября 2019

Я использую Scrutor для регистрации всех типов в моей сборке, которые реализуют интерфейсы. Однако я хочу исключить типы, которые наследуют неабстрактные типы, которые реализуют интерфейс.

У меня есть структура кода, подобная следующей (все члены типа опущены для краткости):

interface IBar {}

interface IFoobar : IBar {}

class Bar : IBar {}

class Foobar : Bar, IFoobar {}

In Startup.ConfigureServices:

services.Scan(s => s.FromCallingAssembly().AddClasses(false).AsImplementedInterfaces());

Это приводит к двум регистрациям для IBar, одна с типом реализации Bar и одна с типом реализации Foobar. Мне нужна одна регистрация для IFoobar (разрешается до Foobar), которую я получаю, но только одна регистрация для IBar, которая разрешается до Bar.

Foobar, происходит от Barпотому что это требует функциональности в Bar, в то время как IFoobar расширяет IBar.

Есть ли способ гарантировать, что интерфейс регистрируется только один раз в классе, который наследует его напрямую, а не через базовые классы?

1 Ответ

1 голос
/ 28 октября 2019

Я понял это, используя RegistrationStrategy согласно здесь (ссылка ошибочно называет его ReplacementStrategy). Я просто ищу и регистрирую соответствующий интерфейс после , сначала регистрируя все реализованные интерфейсы, но используя команду «заменить на тип реализации» RegistrationStrategy.

services.Scan(s => s
    .FromCallingAssembly()
    .AddClasses(false)
    .AsImplementedInterfaces()
    .UsingRegistrationStrategy(RegistrationStrategy.Replace(ReplacementBehavior.ImplementationType))
    .AsMatchingInterface());

. Это делает работу!

...