Вместо того, чтобы полагаться на атрибуты в нужных местах, я обычно создаю несколько типов, которые фактически являются просто псевдонимами. Это полезно, поскольку в Ninject (и, вероятно, в других контейнерах IoC) мы запрашиваем зависимости по их имени типа.
Так что, если вам нужно «запросить» хранилище пользователя по сравнению с центральным, я бы создал типы с псевдонимом, подобным этому:
interface IRepository { /* methods and properties */ }
interface IUserRepository : IRepository {}
interface ICentralRepository : IRepository {}
class Foo
{
public Foo(IUserRepository userRepo, ICentralRepository centralRepo)
{
// assign to fields
}
}
Я предпочитаю это, потому что тогда Ninject вообще не попадает в мое приложение, оно более декларативно, и я думаю, что его проще запомнить, чем любой подход на основе атрибутов, основанный на соглашениях, такой как тот, который вы пробуете.