Ninject в сборке

#load #repository #ninject #design-patterns

#загрузка #репозиторий #ninject #шаблоны проектирования

Вопрос:

У меня есть проект под названием MyProjectReport (сборка). В этом проекте у меня есть класс с именем MyMainReport . В этом классе (я использую шаблон repsoitory в сборке) у меня есть два интерфейса. Один интерфейс называется 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());
    }

}
  

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

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

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

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

Комментарии:

1. Это Java? Если это так, вы получите лучшие результаты, заменив тег сборки для java .

Ответ №1:

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

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

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

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