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

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

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

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

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

1 Ответ

1 голос
/ 21 апреля 2010

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

var kernel = new StandardKernel();
kernel.Scan( x=>
             {
                 x.FromAssemblyContaining<MyEntityMapper>();
                 x.FromCallingAssembly();
                 x.WhereTypeInheritsFrom<IEntityMapper>();
                 x.InSingletonScope();
             } );
...