2015-08-10 4 views
0

Я нахожу решение для разрешения экземпляра на вызов метода. Нечто подобное:Ninject - разрешить экземпляр на вызов метода

public class ServiceAPI 
{ 
    public void ServiceAction() 
    { 
     //Call certain repository action 
     // Ex: 
     Kernel.Get<RepositoryA>().Insert(); 

    } 
} 

public class RepositoryA 
{ 
    public void Insert(object a) 
    { 
     //Get logger per service call ? 
     var logger = Kernel.Get<RepositoryA>().Insert(); 

    } 
} 

Я хочу экземпляр регистратор создал один раз за вызов службы и будут использоваться в хранилище. Я стараюсь использовать расширения Ninject.Extensions.NamedScope, но он еще не сработал. У вас есть способ справиться с этим сценарием?

ответ

0

Это не можно достичь этого, используя механизм обзора. (InCallScope(), InNamedScope(...), ...). Scoping применим только тогда, когда ninject вызывает конструктор типа. Ninject не может - когда-либо - заменить экземпляр, который уже передан объекту. Если вы хотите сделать это, вам нужно запрограммировать его самостоятельно.

Вот два дизайна альтернативы, как вы можете достичь того, чего вы хотите:

  • экземпляр объекта дерева на вызов метода. Если есть какая-то инфраструктура обслуживания, такая как WCF или Web-API, возможно, есть крючки, которые можно использовать для этого.
  • заменить объект, который должен быть создан для вызова метода прокси-сервером. Затем прокси-сервер может использовать Ninject для создания цели для каждого вызова метода и выполнения метода на нем.

Для проксирования вы можете использовать такие инструменты, как Castle DynamicProxy или LinFu. Также есть Ninject.Extensions.Interception, что также может быть полезно.