NВвести эквивалент AutFac's AsClosedTypesOf - PullRequest
4 голосов
/ 19 января 2012

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

var builder = new ContainerBuilder();

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

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

1 Ответ

2 голосов
/ 20 января 2012

Используя 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>. Но для Фу оба IBar<int, int>, IFoo действительны.

...