2013-03-16 3 views
0

У меня есть интерфейс, привязанный к классу. Все работает как за исключением. Я хочу создать класс с инжектором конструктора без передачи моего ядра всюду. Я хочу, чтобы для них предлагалась одна машина. Как я могу создать его без использования библиотеки ninject.extensions.factory.Ninject Singleton Factory

+0

Укажите тип вашего приложения (exe/WF/Service/MVC) - есть ли какие-то утилиты, относящиеся к каждой технологии? –

+0

Его WPF, но мне он нужен внутри класса модели данных, не внутри какой-либо viewmodel или чего-то еще. –

ответ

2

Если вы хотите создать фабрику, но без использования Factory Extension (не знаю, почему, это именно то, что вам нужно здесь, я думаю) вы можете сделать что-то вроде следующего:

public class FooFactory : IFooFactory 
{ 
    // allows us to Get things from the kernel, but not add new bindings etc. 
    private readonly IResolutionRoot resolutionRoot; 

    public FooFactory(IResolutionRoot resolutionRoot) 
    { 
     this.resolutionRoot = resolutionRoot; 
    } 

    public IFoo CreateFoo() 
    { 
     return this.resolutionRoot.Get<IFoo>(); 
    } 

    // or if you want to specify a value at runtime... 

    public IFoo CreateFoo(string myArg) 
    { 
     return this.resolutionRoot.Get<IFoo>(new ConstructorArgument("myArg", myArg)); 
    } 
} 

public class Foo : IFoo { ... } 

public class NeedsFooAtRuntime 
{ 
    public NeedsFooAtRuntime(IFooFactory factory) 
    { 
     this.foo = factory.CreateFoo("test"); 
    } 
} 

Bind<IFooFactory>().To<FooFactory>(); 
Bind<IFoo>().To<Foo>(); 

Расширение Factory только делает все это для вас во время выполнения. Вам нужно только определить заводский интерфейс, а расширение создает динамическую динамику.

0

Попробуйте этот код:

class NinjectKernelSingleton 
{ 
    private static YourKernel _kernel; 

    public static YourKernel Kernel 
    { 
     get { return _kernel ?? (_kernel = new YourKernel()); } 
    } 

} 

public class YourKernel 
{ 
    private IKernel _kernel; 
    public YourKernel() 
    { 
     _kernel = InitKernel(); 
    } 

    private IKernel InitKernel() 
    { 
     //Ninject init logic goes here 
    } 

    public T Resolve<T>() 
    { 
     return _kernel.Get<T>(); 
    } 
} 
+2

Я бы не предложил идти по этому маршруту, так как это пример анти-шаблона локатора сервиса: http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/ – rossipedia

+0

- это приемлемый шаблон дизайна это так? –

+0

Проверьте код .. –

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