Можно ли поручить Ninject применять контекстную логику ко всем привязкам?

Недавно мы начали использовать Dependency Injection, и мы выбрали Ninject 2 (пока) в качестве нашего контейнера IoC. Когда я реорганизую наше решение для включения принципов DI, я столкнулся с чем-то, что немного меня беспокоит, и мне интересно, есть ли простой способ обойти это.

Для нашего уровня данных у нас есть целая куча классов доступа к данным, которые наследуют один и тот же универсальный класс (EntityMapper). Хотя в прошлом мы всегда создавали новые экземпляры этих классов, когда они были нужны, все они действительно могли быть превращены в синглтоны. Мы переопределили ObjectDataSource, чтобы использовать Ninject для создания экземпляра его объекта доступа к данным, поэтому каждый раз, когда мы создаем ObjectDataSource, который указывает на один из наших классов EntityMapper, Ninject будет использовать свою стратегию самосвязывания по умолчанию для внедрения необходимых зависимостей. Поскольку этих классов очень много, мы бы не стали создавать явную привязку для каждого из наших классов EntityMapper, и нам бы не пришлось ставить специальный атрибут для каждого из них. Тем не менее, я хотел бы быть в состоянии поручить Ninject превратить любой экземпляр EntityMapper в одноэлементный класс. Что-то вроде этого:

Bind(t => typeof(IEntityMapper).IsAssignableFrom(t)).InSingletonScope();

Есть какой-либо способ сделать это?

1 ответ

Решение

Вы можете использовать расширение конвенций, чтобы сделать следующее

var kernel = new StandardKernel();
kernel.Scan( x=>
             {
                 x.FromAssemblyContaining<MyEntityMapper>();
                 x.FromCallingAssembly();
                 x.WhereTypeInheritsFrom<IEntityMapper>();
                 x.InSingletonScope();
             } );
Другие вопросы по тегам