2016-10-21 2 views
0

У меня есть два класса, которые зависят друг от друга. Очевидно, что, когда я использую Ninject следующим образом:Впрыск впрыска не работает

public Class Class1() 
{ 
    private readonly class2; 
    public Class1(IClass2 class2) 
    { 
    this.class2 = class2; 
    } 
} 

public Class Class2() 
{ 
    private readonly class1; 
    public Class1(IClass1 class1) 
    { 
    this.class1 = class1; 
    } 
} 

Это приводит к циклической зависимости.

Я знаю, что способ решить эту проблему - это инъекция свойств. Но я попытался это:

public Class Class1() 
{ 
    private readonly class2; 
    public Class1() 
    { 
    } 
    [Inject] 
    IClass2 Class2 
    { 
    get { return this.class2; } 
    set { this.class2 = value; } 
    } 
} 

в сочетании с этим:

public Class Class2() 
{ 
    private readonly class1; 
    public Class1(IClass1 class1) 
    { 
    this.class1 = class1; 
    } 
} 

И на перевернутом пути, когда я впрыснуть во втором со свойством и в первом с конструктором. Оба они приводят к циклической зависимости. Третий способ, когда я использую вложение свойств в обоих из них, приводит к исключению StackOverflow. Каков способ внедрения такого типа инъекций? Имея в виду, что оба эти класса обслуживания.

Переплет:

/// <summary> 
     /// Creates the kernel that will manage your application. 
     /// </summary> 
     /// <returns>The created kernel.</returns> 
     private static IKernel CreateKernel() 
     { 
      var kernel = new StandardKernel(); 
      try 
      { 
       kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
       kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

       RegisterServices(kernel); 
       return kernel; 
      } 
      catch 
      { 
       kernel.Dispose(); 
       throw; 
      } 
     } 

     /// <summary> 
     /// Load your modules or register your services here! 
     /// </summary> 
     /// <param name="kernel">The kernel.</param> 
     private static void RegisterServices(IKernel kernel) 
     { 
      kernel.Bind(b => b 
      .From(Assemblies.ProjectServices) // link to the services there 
      .SelectAllClasses() 
      .BindDefaultInterface()); 
     } 
+0

Впрыск недвижимости должен решить циклическую зависимость, можете ли вы показать нам, где исключение? – YuvShap

+0

У меня есть контроллер, где я вставляю Class1 (это зависит от него). Когда я пытаюсь инициализировать его, это исключает исключение. – StefanL19

+0

Можете ли вы показать нам привязку ядра ninject? – YuvShap

ответ

1

Я думаю, что вы можете попробовать использовать другие Object Scopes при регистрации Class1 и Class2 вместо одного (умолчанию используется именно InTransientScope()).

Что-то вроде этого (я использовал одноплодной сферу здесь, например):

kernel.Bind<IClass1>().To<Class1>().InSingletonScope(); 
kernel.Bind<IClass2>().To<Class2>().InSingletonScope(); 

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

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

+0

Вы пытались использовать область Singleton, Что делать, если действительная программа не может работать с экземпляром Singleton, но нужен уникальный объект. –

+0

Работает таким образом. Спасибо! – StefanL19

+0

@MrinalKamboj Я не согласен с тем, что является проблемой, вы можете выбрать из уже существующих областей тот, кто отвечает вашим потребностям, и если вы не можете создать пользовательский, то синглтонная область была только для примера. – YuvShap

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

  • Нет связанных вопросов^_^