2010-03-24 1 views
2

Скажем, у меня есть класс с зависимостью впрыскивается:Как создавать объекты классов, в которые вставляются зависимости?

public class SomeBusinessCaller { 
    ILogger logger; 
    public SomeBusinessCaller(ILogger logger) { 
     this.logger = logger; 
    } 
} 

Мой вопрос, как я могу создать объект этого класса? Предположим, у меня есть реализация для этого, называемая AppLogger. После того как я скажу

ObjectFactory.For<ILogger>().Use<AppLogger>(); 

как я могу назвать конструктор SomeBusinessCaller? Я звоню

SomeBusinessCaller caller = ObjectFactory.GetInstance<SomeBusinessCaller>(); 

или для этого существует другая стратегия?

ответ

1

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

public class SomeOtherClass 
{ 
    public SomeOtherClass(SomeBusinessCaller caller) 
    { 
     // ... 
    } 
} 

Контейнер будет выяснить, что SomeBusinessCaller требует ILogger, и он будет автоматически предоставлять экземпляр AppLogger.

И, когда надо что-то экземпляр этого класса:

public class YetAnotherClass 
{ 
    public YetAnotherClass(SomeOtherClass other) 
    { 
     // ... 
    } 
} 

Если вы будете следовать, что логика для всех объектов, которые вы пишете, в конце концов, вы будете иметь ровно 1 объект, для которого вы на самом деле запросить экземпляр :

public static void Main() 
{ 
    // ...Initialize ObjectFactory... 

    var compositionRootObject = ObjectFactory.GetInstance<YetAnotherClass>(); 

    compositionRootObject.DoYourThing(); 
} 
+0

Я думаю, что получаю то, что вы говорите. Итак, мне нужно настроить контейнер, а затем создать экземпляр только одного объекта через вызов GetInstance? Все его зависимости будут удовлетворительно удовлетворяться контейнером? – chester89

+0

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

2

В зависимости от того, какой DI-контейнер вы используете, тогда да: спросите контейнер, чтобы предоставить вам экземпляр SomeBusinessCaller.

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

Однако don't use the DI Container as a static Service Locator.

Вместо этого вы должны позволить контейнеру DI составить весь график зависимостей за один раз в Composition Root приложения.

+0

Я понимаю, что автоматическая проводка должна выяснить требования класса, но вызова сторона по-прежнему необходимо предоставить параметр для конструктора класса – chester89

+0

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

+0

Итак, беззазорный конструктор выполнит эту работу? – chester89