Ninject родовые привязки - PullRequest
0 голосов
/ 09 мая 2011

Я создаю приложение, используя Ninject и ASP.NET MVC 3. Возможно ли с помощью Ninject предоставить общую привязку в модуле следующим образом:

 Bind(typeof(IRepository<>)).To(typeof(SomeConcreteRepository<>));

EDIT: А затем для определенного типа создайте класс, который наследуется от SomeConcreteRepository:

Bind(typeof(IRepository<Person>)).To(typeof(PersonConcreteRepository));

Это вызывает исключение, что доступно несколько привязок. Однако есть ли другой подход к этому? Существуют ли другие платформы DI для .NET, которые поддерживают это поведение?

Ответы [ 3 ]

3 голосов
/ 09 мая 2011

Вам не нужна вторая строка.Просто зарегистрируйте открытые универсальные типы:

kernel.Bind(typeof(IRepository<>)).To(typeof(SomeConcreteRepository<>));

, а затем загрузите определенный репозиторий, например, так:

var repo = kernel.Get<IRepository<Person>>();

, или вы также можете использовать поставщика .

1 голос
/ 09 мая 2011

Немного неприятного исправления, но для рассматриваемого сценария это работает:

public class MyKernel: StandardKernel
  {
    public MyKernel(params INinjectModule[] modules) : base(modules) { }

    public MyKernel(INinjectSettings settings, params INinjectModule[] modules) : base(settings, modules) { }

    public override IEnumerable<IBinding> GetBindings(Type service)
    {
      var bindings = base.GetBindings(service);


      if (bindings.Count() > 1)
      {
        bindings = bindings.Where(c => !c.Service.IsGenericTypeDefinition);
      }

      return bindings;
    }
  }
0 голосов
/ 14 мая 2012
public class ExtendedNinjectKernal : StandardKernel
{
    public ExtendedNinjectKernal(params INinjectModule[] modules) : base(modules) { }

    public ExtendedNinjectKernal(INinjectSettings settings, params INinjectModule[] modules) : base(settings, modules) { }

    public override IEnumerable<IBinding> GetBindings(Type service)
    {
        var bindings = base.GetBindings(service);

        //If there are multiple bindings, select the one where the service does not have generic parameters
        if (bindings.Count() > 1 && bindings.Any(a => !a.Service.IsGenericTypeDefinition))
            bindings = bindings.Where(c => !c.Service.IsGenericTypeDefinition);

        return bindings;
    }
}
...