2010-04-15 2 views
1

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

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

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

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

ответ

1

Вы можете использовать conventions extension сделать следующее

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