2012-01-19 3 views
4

Что такое Ninject эквивалент следующего кода, который использует Autofac:Ninject эквивалент AsClosedTypesOf Autofac в

var builder = new ContainerBuilder(); 

System.Reflection.Assembly assembly = ...; 
builder.RegisterAssemblyTypes(assembly).AsClosedTypesOf(typeof(OpenGeneric<>)) 
             .As<IAnInterface>(); 

var resolved = container.Resolve<IEnumerable<IAnInterface>>(); 

ответ

2

Использование Ninject 3.0.0-RC3 можно использовать

kernel.Bind(
     x => x.FromThisAssembly() 
      .SelectAllClasses().InheritedFrom(typeof(BaseService<>)).WhichAreGeneric() 
      .BindToAllInterfaces()); 

В зависимости от ваших требований вы возможно, удалит оператор WhichAreGeneric. .SelectAllClasses().InheritedFrom(typeof(BaseService<>)).WhichAreGeneric() выбирает классы, для которых создается привязка.

Условные обозначения гарантируют, что интерфейс и класс реализации должны иметь одинаковые аргументы открытого типа. Например. В случае

interface IBar<T1, T2> 
interface IBaz<T> 
interface IFoo 
class Bar<T1, T2> : IBar<T1, T2>, IBaz<T1>, IFoo 
class Foo : IBar<int, int>, IFoo 

IBar<T1, T2> является единственным правильным интерфейсом для Bar<T1, T2>. Но для Foo действуют как IBar<int, int>, IFoo.

+0

OK, спасибо за ваш быстрый ответ (на данный момент я нахожусь на Autofac) –

+0

Теперь это возможно с помощью Ninject 3.0.0-rc3 –

+0

Спасибо за обновление, когда выйдет 3,0 финала? –

Смежные вопросы