Ninject в сборке - PullRequest
       19

Ninject в сборке

0 голосов
/ 14 октября 2011

У меня есть проект 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.Как бы я мог загрузить свои репозитории в сборку / проект?

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

1 Ответ

1 голос
/ 15 октября 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...