2014-12-01 2 views
1

Я пытаюсь извлечь Связывание интерфейсов с классами, которые реализуют их, и экземпляр экземпляра в отдельный проект.Ninject - Извлечение экземпляра экземпляра отдельному проекту/классу

Это то, что я до сих пор:

public class DependencyModule : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<IMyClass>().To<MyClass>(); 
     } 
    } 

Это мой модуль. И в этом классе я хочу создать статический метод, который при передаче любой интерфейс пытается найти класс, это привязать к нему и вернуть его экземпляр:

public static class Resolver<T, U> 
    { 
     public static T GetInstance<T>(U requestedInterfaceInstance) 
     { 
      var kernel = new StandardKernel(new DependencyModule()); 

      return kernel.Get<requestedInterfaceInstance>(); 
     } 
    } 

Итак, Я думаю, что мне нужно два типа параметры? Один для возвращаемого типа объекта, который я хочу вернуть (например, экземпляр MyClass), и один для моего параметра метода, который в этом случае был бы (IMyClass).

Как я могу добиться этого лучше? Благодарю.

ответ

0
  • Ядро не следует воссоздавать для каждого запроса/создания экземпляра. Создайте ядро ​​один раз (новый Standardkernel() ...), а затем используйте один и тот же экземпляр для каждого запроса.
  • Что вы сделали, это так называемый шаблон Service Locator. Идея контейнеров ninject и Dependency-Injection состоит в том, чтобы следовать шаблону Register Resolve Release. В идеале должен быть только один вызов kernel.Get<> - для корневого компонента. Все остальные компоненты вводятся в корневой компонент.
  • в случае, если в какой-то момент вам действительно нужно специально создать экземпляр - не путем инъекции конструктора - вы должны использовать шаблон Abstract Factory. В качестве альтернативы и проще использовать ninject factory extension