Использование Activator лучший способ создания экземпляров классов с несколькими конструкторами - PullRequest
1 голос
/ 03 августа 2009

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

Я достигаю этого, используя Activator.CreateInstance во всех классах, которые реализуют указанный интерфейс в сборке плагина.

В настоящее время я использую только одну реализацию класса, и для нее у меня есть два аргумента конструктора, и я включил их в вызов Activator.CreateInstance:

 instanceList.Add((Foo)Activator.CreateInstance(_TypeList[typeKey], new object[] { arg1, arg2 }));

Я понимаю, что это может вызвать проблемы позже, если будет добавлена ​​реализация, которая не использует эту сигнатуру конструктора. Какова лучшая ситуация, чтобы справиться с этим.

Явно скажите через документацию, что конструкторы должны использовать эту подпись, а затем заключить ее в try / catch?

Или был бы способ вызвать конструктор класса? учитывая, что мне нужно как-то сопоставить аргументы конструктора.

Или ... избегать аргументов конструктора, помещая аргументы в статический класс как статические свойства?

Ответы [ 2 ]

1 голос
/ 03 августа 2009

Я бы потребовал, чтобы все плагины имели конструктор без параметров и добавляли метод инициализации в интерфейс с некоторыми общими аргументами.

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

1 голос
/ 03 августа 2009

Во-первых, я бы реорганизовал код, чтобы абстрагировать конструкцию, скажем, от фабричного класса. Тогда стратегия, используемая на фабрике, может решить, как лучше (если они различаются) и что делать в случае ошибок, таких как отсутствующий конструктор. Вы можете использовать универсальные шаблоны, чтобы сделать интерфейсы строго или свободно напечатанными, как вам нужно.

Хотя я бы придерживался Активатора. Мы проделали большую работу с этим типом конструкции, и он купил нам много вещей, включая позднюю привязку, основанную на типах, обнаруженных во время выполнения, синглтоне, псевдонимах типов, пользовательской безопасности и т. Д.

...