2016-07-27 10 views
1

Ninject создает для меня экземпляр класса A, который зависит от класса B (поэтому ninject создал также объект B). Ninject настроен на возврат одного экземпляра класса A (InSingletonScope) и многих экземпляров класса B (InTrancientScope). Класс A имеет свойство, которое позволяет получить/установить зависимость объекта B.ninject - вводить зависимость от существующего объекта во время запроса

Возможно ли получить экземпляр класса A с вновь созданным экземпляром B каждый раз, когда я запрашиваю тот же экземпляр класса A?

Метод OnActivation выполнил бы трюк, если бы он был выполнен по каждому запросу не только в первый раз.

Возможно, это какой-то анти-шаблон, который я собираюсь сделать?

EDIT: Чтобы избежать проблемы XY, я попытаюсь объяснить более подробную информацию. Решение слишком велико, чтобы объяснить все так короткое короткое описание:

Существует Операция, например, инвентаризация. Операция заполняется тремя Ведущие (P1, P2, P3). Ведущие управляют соответствующими Просмотров (V1, V2, V3). Пользователь вводит данные в представления, ведущие получают данные из представлений и сохраняют операцию. Все ведущие и представления - это синглтоны (InSingletonScope), чтобы избежать создания объектов каждый раз, когда это необходимо. Представления вводятся соответствующим докладчикам. Каждый раз, когда начинается работа, должен быть создан новый экземпляр операции и вводится всем ведущим, которые уже существуют.

+2

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

+0

, который вы всегда можете вводить в локатор сервисов для разрешения зависимости каждый раз, когда захотите. –

+0

ОК, это решение, но мне интересно, есть ли более простое решение. Некоторый метод .OnResolved будет очень простым. Интересно, почему этого не происходит. – raV720

ответ

0

Всякий раз, когда вы запрашиваете презентатор от МОК, он возвращает тот же ведущий с той же фабрикой операций. Оператор Factory может возвращать тот же объект или новый объект, если вы установите IsValid на false. пример кода, который создан, чтобы решить эту проблему:

РАБОТА:

public abstract class Operation 
    { 
     protected Logger logger; 

     public Operation(Logger logger) 
     { 
      this.logger = logger; 
     } 
    } 


public class StocktakingOperation : Operation 
    { 
     public string test = DateTime.Now.ToString(); 

     public StocktakingOperation(Logger logger) 
      : base(logger) 
     { 

     } 
    } 

ФАБРИКА:

class OperationFactory<T> where T : Operation 
    { 
     private Func<T> ObjectCreation; 

     private T ValidObject; 


     public OperationFactory(Func<T> ObjectCreation) 
     { 
      IsValid = false; 
      this.ObjectCreation = ObjectCreation; 
     } 


     /// <summary> 
     /// While is True then the same operation is returned. 
     /// Set it to False to invalidate current operation so the next call to get operation will return new operation. 
     /// </summary> 
     public bool IsValid { get; set; } 



     public T GetOperation() 
     { 
      if (IsValid == false) 
      { 
       ValidObject = ObjectCreation(); 
       IsValid = true; 
      } 

      return ValidObject; 
     } 

    } 


class StocktakingOperationFactory : OperationFactory<StocktakingOperation> 
    { 
     public StocktakingOperationFactory(Func<StocktakingOperation> ObjectCreation) 
      : base(ObjectCreation) 
     { 

     } 
    } 

ВЕДУЩИЙ

class StocktakingPresenter : BaseOperationPresenter<StocktakingPresentersManager, OPERATION_TYPE> 
    { 

     public StocktakingPresenter(QuickForm QuickForm, StocktakingOperationFactory OperationFactory, VIEW_TYPE view, Workspace workspace, Logger logger) 
      : base(QuickForm, OperationFactory, view, workspace, logger) 
     {} 


    } 

И МОК:

kernel.Bind<StocktakingOperation>().ToSelf(); 

kernel.Bind<StocktakingOperationFactory>().ToMethod(c => 
      new StocktakingOperationFactory(() => { return kernel.Get<StocktakingOperation>(); }) 
      ).InSingletonScope(); 
kernel.Bind<StocktakingPresenter>().ToSelf().InSingletonScope();