Озвучили мне идею — написать классам атрибут с характерным уникальным значением. А фабрика, чтобы получить входным параметром значение искала класс с соответствующим атрибутом и создавала экземпляр объекта.
Не могу найти решение как реализовать. Смотрел на Type.GetType, но там поиск по имени, а не по атрибуту. Циклически перебирать подходящие классы... наверное можно, но возможно существует лучшее решение?
Здравствуйте, CyberRussia, Вы писали:
CR>Не могу найти решение как реализовать. Смотрел на Type.GetType, но там поиск по имени, а не по атрибуту. Циклически перебирать подходящие классы... наверное можно, но возможно существует лучшее решение?
Ничего лучше перебора нет. Другое дело что ты можешь перебрать один раз, закешировать на диске и потом уже поднимать прицельно. Имеет смысл если сборок много, а классов таких мало.
Кроме того, если нет уверенности что сканируемые сборки все равно придётся грузить, то при сканировании лучше напрямую читать метаданные или хотя бы использовать LoadForReflection.
И да, лучше не изобретать велосипед, а воспользоваться готовым MEF
Здравствуйте, CyberRussia, Вы писали:
CR>Озвучили мне идею — написать классам атрибут с характерным уникальным значением. А фабрика, чтобы получить входным параметром значение искала класс с соответствующим атрибутом и создавала экземпляр объекта. CR>Не могу найти решение как реализовать. Смотрел на Type.GetType, но там поиск по имени, а не по атрибуту. Циклически перебирать подходящие классы... наверное можно, но возможно существует лучшее решение?
Чтобы не перебирать -- лучше плагины/расширения конфирурировать не атрибутами а в файле конфигурации. Т.е. создаете xml/json-файл в корне и там перечисляете список всех ваших плагинов (к примеру название и тип с указанием пространства имен).
Re[2]: Фабрика классов работающая по атрибуту класса
Здравствуйте, Shmj, S>Чтобы не перебирать -- лучше плагины/расширения конфирурировать не атрибутами а в файле конфигурации.
Нет никаких плагинов. Озвучена идея вместо switch использовать поиск класса по атрибуту. Чтобы при очередном расширении проекта просто добавить очередной класс с новым значением атрибута и больше ничего не трогать в коде.
Re[3]: Фабрика классов работающая по атрибуту класса
Здравствуйте, CyberRussia, Вы писали:
CR>Нет никаких плагинов. Озвучена идея вместо switch использовать поиск класса по атрибуту. Чтобы при очередном расширении проекта просто добавить очередной класс с новым значением атрибута и больше ничего не трогать в коде.
Ну вот как всегда -- выбрали неверное архитектурное решение и теперь имеете лишние проблемы.
Re[4]: Фабрика классов работающая по атрибуту класса
Здравствуйте, Shmj, Вы писали: S>Ну вот как всегда -- выбрали неверное архитектурное решение и теперь имеете лишние проблемы.
Да нет еще никакого решения. Есть идея. Идет анализ возможности ее реализации. По результатам анализа и будет принято решение о том или ином варианте. Но чтобы его выбрать нужно знать можно ли решить и какие будут трудозатраты.
Re[2]: Фабрика классов работающая по атрибуту класса
Здравствуйте, AndrewVK, Вы писали: AVK>И да, лучше не изобретать велосипед, а воспользоваться готовым MEF
Нет смысла тащить экскаватор туда, где достаточно лопаты
Здравствуйте, CyberRussia, Вы писали:
CR>Добрый день,
CR>Озвучили мне идею — написать классам атрибут с характерным уникальным значением. А фабрика, чтобы получить входным параметром значение искала класс с соответствующим атрибутом и создавала экземпляр объекта. CR>Не могу найти решение как реализовать. Смотрел на Type.GetType, но там поиск по имени, а не по атрибуту. Циклически перебирать подходящие классы... наверное можно, но возможно существует лучшее решение?
Ну если характерное уникальное значение — это полное имя класса, то Activator.CreateInstance будет достаточно. Но чем это лучше простого применения оператора new?
Re[2]: Фабрика классов работающая по атрибуту класса
Здравствуйте, Vladek, Вы писали: V>Ну если характерное уникальное значение — это полное имя класса, то Activator.CreateInstance будет достаточно. Но чем это лучше простого применения оператора new?
Характерное уникальное значение это версия пакета данных пришедших на обработку. Разные классы умеют работать с разными версиями. Фабрика получает параметр — версию, возвращает класс для обработки. Решение в лоб — switch. Просто и действенно. Какая и зачем возникла идея я описал изначально.
Re[2]: Фабрика классов работающая по атрибуту класса
Здравствуйте, CyberRussia, Вы писали:
CR>Озвучили мне идею — написать классам атрибут с характерным уникальным значением. А фабрика, чтобы получить входным параметром значение искала класс с соответствующим атрибутом и создавала экземпляр объекта. CR>Не могу найти решение как реализовать. Смотрел на Type.GetType, но там поиск по имени, а не по атрибуту. Циклически перебирать подходящие классы... наверное можно, но возможно существует лучшее решение?
Мы похожую задачу решили так. Сделали атрибут уровня сборки в котором в качестве параметра typeof(класс_который_надо_создать).
Преимущества — скорость загрузки. Читаются только метаданных глобальных атрибутов. Это очень быстро.
Здравствуйте, CyberRussia, Вы писали:
CR>Здравствуйте, Vladek, Вы писали: V>>Ну если характерное уникальное значение — это полное имя класса, то Activator.CreateInstance будет достаточно. Но чем это лучше простого применения оператора new? CR>Характерное уникальное значение это версия пакета данных пришедших на обработку. Разные классы умеют работать с разными версиями. Фабрика получает параметр — версию, возвращает класс для обработки. Решение в лоб — switch. Просто и действенно. Какая и зачем возникла идея я описал изначально.
Я обычно делаю так:
interface IHandler
{
bool CanHandle(int version);
void Handle(int version, object data);
}
class HandleDispatcher : IHandler
{
private readonly IHandler[] handlers;
public HandleDispatcher()
{
// каким-то образом получаем/создаём экземпляры всех конкретных обработчиковthis.handlers = ...;
}
public bool CanHandle(int version)
{
return this.handlers.Any(h => h.CanHandle(version));
}
public void Handle(int version, object data)
{
var handler = this.handlers.Single(h => h.CanHandle(version));
handler.Handle(version, data);
}
}
В итоге, у меня есть один обработчик, который умеет обрабатывать всё подряд.
Re[3]: Фабрика классов работающая по атрибуту класса
Здравствуйте, CyberRussia, Вы писали:
AVK>>И да, лучше не изобретать велосипед, а воспользоваться готовым MEF CR>Нет смысла тащить экскаватор туда, где достаточно лопаты
Этот экскаватор уже втащен в фреймворк, так что ничего тащить не надо.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>