NInject: разрешить внедрение конструктора с двумя параметрами

#c# #ninject

#c# #ninject

Вопрос:

Я создал эти интерфейсы и классы:

 interface IInterpreter.
interface IViz.
interface IVizDescriptor.
 

где,

 class IntOne : IInterpreter.
 

и,

 class VizDescOne : IVizDescriptor {
    VizDescOne(string title, Type type, SchemaType schemaType, string desc)
    { }
}
 

и,

 class VizOne : IViz {
    public VizOne (IntOne, IVizDescriptor)
    {
    }
}
 

Я понял, что могу создавать привязки между IInterpreter и IntOne для того, чтобы, когда я запрашиваю a VizOne , a IntOne вводится в конструктор первого параметра.

Проблема в том, что нет способа создать подходящую привязку для VizDescOne .
VizDescOne
параметры конструктора слишком зависят от каждой ситуации, я не могу создать для него привязку.

Есть ли какой-нибудь способ предоставить его manually и разрешить VizOne (IntOne, IVizDescriptor) конструктор?

Однако IVizDescriptor слишком многое зависит от любой конкретной ситуации

Комментарии:

1. Я ожидаю, что такие параметры, как title , type и desc являются значениями времени выполнения; они не являются постоянными в течение всего срока службы приложения. Вы не должны злоупотреблять своим контейнером для внедрения данных времени выполнения в компоненты .

Ответ №1:

У вас есть много вариантов:

  1. Вы можете привязать IVizDescriptor к VizDescOne с помощью аргументов конструктора:
     kernel.Bind<IVizDescriptor>().To<VizDescOne>()
          .WithConstructorArgument("title", "someTitle").WithConstructorArgument("type", typeof(int))...
     
  2. Вы можете привязать IVizDescriptor к константе:
     IVizDescriptor vizDescOne = new VizDescOne(...);
    kernel.Bind<IVizDescriptor>().ToConstant(vizDescOne);
     
  3. Вы можете привязать IVizDescriptor к методу:
     kernel.Bind<IVizDescriptor>().ToMethod(o=> new VizDescOne(...));
     

Вы можете прочитать больше об этих параметрах и еще о нескольких здесь и здесь .

В качестве примечания я действительно рекомендую вам прочитать комментарий @Steven и статью, на которую он ссылался, потому что, если параметры конструкторов соответствуют значениям времени выполнения, вам следует пересмотреть свой дизайн.

Комментарии:

1. (что) такое ядро? Документы ninject кажутся довольно неуловимыми.