Нить в сборке

У меня есть проект под названием MyProjectReport (сборка). В этом проекте у меня есть класс MyMainReport. В этом классе (я использую шаблон репозитория в сборке) у меня есть два интерфейса. Один интерфейс называется IReportRepository1 и IReportRepository2. В MyMainReport мой конструктор выглядит следующим образом:

public MyMainReport(IReportRepository1 reportRepository1 , IReportRepository1 reportRepository2 )
    {
        this.reportRepository1 = reportRepository1 ;
        this.reportRepository2 = reportRepository2 ;
    }

. У меня есть NinjectModule следующим образом:

public class DINinjectServiceModule : NinjectModule
{
    public override void Load()
    {
        Bind<IReportRepository1 >()
            .To<ReportRepository>();
        Bind<IReportRepository2 >()
               .To<ReportRepository2>();

    }

}

. Обычно приложение инициализирует ядро ​​в глобальном asax. Пример одного из веб-сервисов WCf будет следующим:

public class Global : NinjectWcfApplication
{

    protected override IKernel CreateKernel()
    {
        return new StandardKernel(new DINinjectServiceModule());
    }

}

Таким образом, мои репозитории будут загружаться автоматически. Однако, поскольку у меня есть сборка, у меня нет файла Global.asax.

Я создал класс, называемый селектором отчетов. я использую шаблон декоратора для динамической загрузки моих отчетов.

public class ReportSelector : IReportBuilder
{
    IReportBuilder buildareport;

    public ReportSelector(IReportBuilder buildareport)
    {            
        this.buildareport = buildareport;            
    }   

    public void CreateDocument()
    {
        buildareport.CreateDocument();
    }
}

Ниже показано, как я обычно вызываю построитель отчетов без использования конструктора IOC.

IReportBuilder buildrep = new ReportSelector(new MyMainReport.ReportBuilder.MyMainReport());
        BuildReport(buildrep);

Тем не менее, он ищет меня, чтобы передать интерфейсы моего репозитория. Он не загружает их динамически. Как мне это настроить. для меня приведенный выше вызов декоратора был бы похож на мой application_start в моем файле Global.asax. Как мне загрузить свои репозитории в сборку/проект?

Спасибо, Ремо Глор! Я решил, что мне нужна фабрика, подобная той, что используется для контроллера в MVC. Однако я не уверен, как мне поступить. Большинство примеров имеют либо расширение, либо использование базового класса, такого как Controller. Я пишу веб-сервис, который будет выполнять пакетный процесс. Использование веб-службы не является моим выбором для этого процесса, хотя я знаю, что некоторые люди предпочитают использовать для этого веб-службы. У меня есть сборка, которая создает динамические PDF-файлы и отправляет эти PDF-файлы по электронной почте. Я хотел бы использовать модуль Ninject для загрузки моих репозиториев, как в проекте MVC. Я не уверен, как это сделать в отдельной сборке. В настоящее время у меня есть селектор отчетов, как указано выше, это похоже на корневой каталог запуска любого приложения. В моем веб-сервисе есть метод BuildAllReports, который любое приложение может вызвать для использования сервиса. Таким образом, при вызове BuildAllReports выполняется пакетный процесс. Можете ли вы привести пример использования Ninject в сборке, как уже упоминалось? Спасибо


person user995556    schedule 14.10.2011    source источник
comment
Это джава? Если это так, вы получите лучшие результаты, заменив тег assembly на java.   -  person karlphillip    schedule 14.10.2011


Ответы (1)


Правильный способ использования контейнера IoC — настроить ядро ​​и разрешить все необходимое для запуска приложения в корне приложения.

Вы уже показали правильный путь для проектов Web и Wcf. В случае исполняемых файлов корень приложения является основным методом программы.

Поскольку вы не сказали, какое заявление вы пишете, я не могу сказать вам, какое из них относится к вам.

Для всего, что может быть разрешено при запуске приложения, вам необходимо создать интерфейс фабрики в своей реализации, чтобы получить эти экземпляры. Реализация этого интерфейса является частью вашей конфигурации cointainer в корне приложения. Такие фабрики — единственное место, где вы должны получить доступ к ядру.

person Remo Gloor    schedule 15.10.2011