Конструктор инъекций - куда звонить? - PullRequest
5 голосов
/ 04 июля 2011

Я немного запутался из-за шаблона и правила Constructor Injection Не вызывайте контейнер;он позвонит вам .

Может кто-нибудь объяснить мне (и, может быть, кому-то еще), как реальное приложение должно получать все преимущества DI, используя Constructor Injection?Я приведу для этого простой и, на мой взгляд, общий пример:

DomainObject
RepositoryObject
DaoObject

Отношения очевидны (я думаю) - RepositoryObject нужен DaoObject, DomainObject нужен репозиторий.

Использование инжектора конструктора Я предполагаю, чтоЯ могу забыть (в большинстве случаев) о ключевом слове NEW, но когда, где и как мне создавать новые объекты (в основном, доменные)?Я должен написать фабрики для всех классов?Должен ли я ссылаться на DI-контейнер на этой фабрике?

Лучше всего будет, когда кто-нибудь покажет мне какой-нибудь реальный пример приложения (пожалуйста, не Asp.Net MVC :)) или нарисует некоторую структуру проекта.

Ответы [ 2 ]

1 голос
/ 04 июля 2011

Ответов и ссылки Марка Симанна достаточно, но я хочу кое-что добавить. Как новичок в DI (которым я являюсь), этот вопрос всегда вызывает у меня сомнения: «Хорошо, нет ничего нового, но когда и как мои реальные объекты вызываются и вводятся?». Мне потребовалось некоторое время, чтобы понять и применить.

Когда вы будете следовать ответам и ссылкам, вы увидите это. Вы должны зарегистрировать свои интерфейсы и классы в файле приложения Global.asax для веб-приложения. Например, если вы используете Ninject, перейдите в nuget и загрузите Ninject.Web (который предназначен для веб-форм) и примените его, как в этом примере http://azolotar.blog.com/2010/06/22/ninject-2-0-in-webforms/

Ключевая точка в примере.

  • Global.asax унаследован от NinjectHttpApplication (который находится в Ninject.Web.dll)
  • Метод CreateKernel переопределяется, здесь вы создаете ядро ​​и сообщаете свою карту зависимостей контейнеру
  • BasePage: это для веб-форм, поэтому ваш интерфейс на страницах будет разрешен, если все они будут получены из базовой страницы.

Я должен добавить это, реализация BasePage довольно проста (вот код на github ), у вас, вероятно, уже есть базовая страница, поэтому добавьте эту строку KernelContainer.Inject (this); OnInit вашей базовой страницы может решить эту проблему. Еще один последний остаток: если вы собираетесь использовать что-либо в ascx, вы должны переопределить OnInit вашего ascx, чтобы контейнер мог разрешать зависимости.

Я знаю, вы сказали, что нет MVC или сети :) Но логика та же

  • Установите вашу зависимую карту при запуске приложения (Main? Для windows)
  • Поскольку он не является веб-сайтом, не имеет URL-адреса и не имеет форм прямого вызова, вы назовете его Как использовать Ninject в приложении Windows Forms? как в этом примере. Не знаю, используете ли вы какие-нибудь скороговорки MVP или MVVM, но это может быть отправной точкой

Черт возьми, это не очень полезный ответ, но в любом случае, надеюсь, это поможет.

1 голос
/ 04 июля 2011

Я не понимаю ваших классовых отношений, так что вот более очевидный пример ;-):

class FooService
{
    IFooRepository FooRepository { get; set; }

    public Service(IFooRepository fooRepository)
    {
        this.FooRepository = fooRepository;
    }
}

class Controller
{
    IFooService FooService { get; set; }
    IBarService BarService { get; set; }

    public Controller(IFooService fooService, IBarService barService)
    {
        this.FooService = fooService;
        this.BarService = barService;
    }
}

Как вы уже сказали - нигде нет ни кода new FooRepository(), ни new FooService().

...