Гибкая система отчетов с динамически загружаемыми сборками - PullRequest
0 голосов
/ 12 мая 2009

Я хочу создать гибкую систему отчетности для своего приложения. Пока у меня в голове только концепция, и мне нужны советы по ее реализации. Я использую Crystal Reports для визуализации отчетов и знаю, как динамически загружать отчеты.

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

<code>public interface IReport
{
    string GetTitle();
    string GetDescription();
    void SetParameter();
    void Print();
}

Также будет некоторая базовая реализация (в виде абстрактного класса), которая будет обрабатывать некоторые общие операции с отчетами (например, привязку к источнику данных и т. Д.):

<code>public abstract class Report
{
    ...
}

Внутри каждой dll будет реализация конкретного класса, представляющая тот или иной отчет:

<code>public class CustomersReport : Report
{
    ...
}

Теперь я должен выяснить следующее:

1) Как динамически найти и загрузить dll?

2) Как создать экземпляр конкретного класса (CustomerReport) и привести его к IReport, чтобы вызвать для него необходимые методы?

Вы когда-нибудь внедряли такую ​​расширяемую систему? Не могли бы вы поделиться своим опытом / фрагментами кода?

Заранее спасибо.

EDIT:

При изучении этого вопроса я нашел статью Джона Скита о Плагины и исключения приведения , которая может оказаться полезной.

Ответы [ 3 ]

1 голос
/ 12 мая 2009

Посмотрите на Mono.Addins (это лицензия MIT, так что все в порядке с закрытым программным обеспечением). Из вашего описания он делает то, что вам нужно. В основном он использует дерево зависимостей + плагины на основе интерфейсов. У него есть собственный менеджер для загруженных .dll-ов, и его объекты основаны на загруженном интерфейсе, поэтому вам больше не нужно магическое приведение для вызова чего-либо.

1 голос
/ 12 мая 2009

Смотрите это: Проблема с динамической загрузкой dll в мою программу Делает именно то, что вы хотите, без всех ЯГНИ вокруг него.

0 голосов
/ 12 мая 2009

Вы можете рассмотреть MEF от Microsoft. Это механизм компоновки, который можно настроить для отслеживания локальной папки и автоматической загрузки сборок, которые экспортируют детали (реализация IReport в вашем случае), которые вас интересуют. У нас есть такая система, которую мы внедрили некоторое время назад. У нас есть одна сборка с отчетами, которую мы загружаем в отдельный домен приложения и перезагружаем, если версия файла изменилась. Затем мы используем удаленное взаимодействие .NET для связи между доменами приложений. Мы рассмотрели возможность использования инфраструктуры надстроек от Microsoft, но обнаружили, что она очень сложная и внушительная, и решили, что в нашем случае она слишком тяжелая и сложная.

...