Фабрика классов работающая по атрибуту класса
От: CyberRussia  
Дата: 07.09.17 15:57
Оценка:
Добрый день,

Озвучили мне идею — написать классам атрибут с характерным уникальным значением. А фабрика, чтобы получить входным параметром значение искала класс с соответствующим атрибутом и создавала экземпляр объекта.
Не могу найти решение как реализовать. Смотрел на Type.GetType, но там поиск по имени, а не по атрибуту. Циклически перебирать подходящие классы... наверное можно, но возможно существует лучшее решение?
Re: Фабрика классов работающая по атрибуту класса
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 07.09.17 16:07
Оценка: +4
Здравствуйте, CyberRussia, Вы писали:

CR>Не могу найти решение как реализовать. Смотрел на Type.GetType, но там поиск по имени, а не по атрибуту. Циклически перебирать подходящие классы... наверное можно, но возможно существует лучшее решение?


Ничего лучше перебора нет. Другое дело что ты можешь перебрать один раз, закешировать на диске и потом уже поднимать прицельно. Имеет смысл если сборок много, а классов таких мало.
Кроме того, если нет уверенности что сканируемые сборки все равно придётся грузить, то при сканировании лучше напрямую читать метаданные или хотя бы использовать LoadForReflection.
И да, лучше не изобретать велосипед, а воспользоваться готовым MEF
AVK Blog
Re: Фабрика классов работающая по атрибуту класса
От: Shmj Ниоткуда  
Дата: 07.09.17 22:39
Оценка:
Здравствуйте, CyberRussia, Вы писали:

CR>Озвучили мне идею — написать классам атрибут с характерным уникальным значением. А фабрика, чтобы получить входным параметром значение искала класс с соответствующим атрибутом и создавала экземпляр объекта.

CR>Не могу найти решение как реализовать. Смотрел на Type.GetType, но там поиск по имени, а не по атрибуту. Циклически перебирать подходящие классы... наверное можно, но возможно существует лучшее решение?

Чтобы не перебирать -- лучше плагины/расширения конфирурировать не атрибутами а в файле конфигурации. Т.е. создаете xml/json-файл в корне и там перечисляете список всех ваших плагинов (к примеру название и тип с указанием пространства имен).
Re[2]: Фабрика классов работающая по атрибуту класса
От: CyberRussia  
Дата: 08.09.17 04:45
Оценка: :)
Здравствуйте, Shmj,
S>Чтобы не перебирать -- лучше плагины/расширения конфирурировать не атрибутами а в файле конфигурации.

Нет никаких плагинов. Озвучена идея вместо switch использовать поиск класса по атрибуту. Чтобы при очередном расширении проекта просто добавить очередной класс с новым значением атрибута и больше ничего не трогать в коде.
Re[3]: Фабрика классов работающая по атрибуту класса
От: Shmj Ниоткуда  
Дата: 08.09.17 06:03
Оценка:
Здравствуйте, CyberRussia, Вы писали:

CR>Нет никаких плагинов. Озвучена идея вместо switch использовать поиск класса по атрибуту. Чтобы при очередном расширении проекта просто добавить очередной класс с новым значением атрибута и больше ничего не трогать в коде.


Ну вот как всегда -- выбрали неверное архитектурное решение и теперь имеете лишние проблемы.
Re[4]: Фабрика классов работающая по атрибуту класса
От: CyberRussia  
Дата: 08.09.17 06:48
Оценка:
Здравствуйте, Shmj, Вы писали:
S>Ну вот как всегда -- выбрали неверное архитектурное решение и теперь имеете лишние проблемы.
Да нет еще никакого решения. Есть идея. Идет анализ возможности ее реализации. По результатам анализа и будет принято решение о том или ином варианте. Но чтобы его выбрать нужно знать можно ли решить и какие будут трудозатраты.
Re[2]: Фабрика классов работающая по атрибуту класса
От: CyberRussia  
Дата: 08.09.17 06:50
Оценка:
Здравствуйте, AndrewVK, Вы писали:
AVK>И да, лучше не изобретать велосипед, а воспользоваться готовым MEF
Нет смысла тащить экскаватор туда, где достаточно лопаты
Re: Фабрика классов работающая по атрибуту класса
От: Vladek Россия Github
Дата: 08.09.17 10:53
Оценка:
Здравствуйте, CyberRussia, Вы писали:

CR>Добрый день,


CR>Озвучили мне идею — написать классам атрибут с характерным уникальным значением. А фабрика, чтобы получить входным параметром значение искала класс с соответствующим атрибутом и создавала экземпляр объекта.

CR>Не могу найти решение как реализовать. Смотрел на Type.GetType, но там поиск по имени, а не по атрибуту. Циклически перебирать подходящие классы... наверное можно, но возможно существует лучшее решение?

Ну если характерное уникальное значение — это полное имя класса, то Activator.CreateInstance будет достаточно. Но чем это лучше простого применения оператора new?
Re[2]: Фабрика классов работающая по атрибуту класса
От: CyberRussia  
Дата: 08.09.17 12:18
Оценка:
Здравствуйте, Vladek, Вы писали:
V>Ну если характерное уникальное значение — это полное имя класса, то Activator.CreateInstance будет достаточно. Но чем это лучше простого применения оператора new?
Характерное уникальное значение это версия пакета данных пришедших на обработку. Разные классы умеют работать с разными версиями. Фабрика получает параметр — версию, возвращает класс для обработки. Решение в лоб — switch. Просто и действенно. Какая и зачем возникла идея я описал изначально.
Re[2]: Фабрика классов работающая по атрибуту класса
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.09.17 16:26
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>И да, лучше не изобретать велосипед, а воспользоваться готовым MEF


Тем более, что как раз в нем кэширование мощено применяется. Правда это и источник глюков. Ствдия уже задрала.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Фабрика классов работающая по атрибуту класса
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.09.17 16:39
Оценка: +1
Здравствуйте, CyberRussia, Вы писали:

CR>Озвучили мне идею — написать классам атрибут с характерным уникальным значением. А фабрика, чтобы получить входным параметром значение искала класс с соответствующим атрибутом и создавала экземпляр объекта.

CR>Не могу найти решение как реализовать. Смотрел на Type.GetType, но там поиск по имени, а не по атрибуту. Циклически перебирать подходящие классы... наверное можно, но возможно существует лучшее решение?

Мы похожую задачу решили так. Сделали атрибут уровня сборки в котором в качестве параметра typeof(класс_который_надо_создать).

Преимущества — скорость загрузки. Читаются только метаданных глобальных атрибутов. Это очень быстро.

Например, вот такой атрибут:
[assembly: ProjectSupport("Nitra C#", typeof(CSharp.CompilationUnit))]

экспортирует объект поддержки проекта для некоторого языка реализуемого на Nitra
Автор: VladD2
Дата: 12.01.17
.

Сам атрибут.

А это код загрузки атрибутов.
А вот, код создания экземпляра.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Отредактировано 08.09.2017 16:47 VladD2 . Предыдущая версия . Еще …
Отредактировано 08.09.2017 16:41 VladD2 . Предыдущая версия .
Отредактировано 08.09.2017 16:41 VladD2 . Предыдущая версия .
Re[3]: Фабрика классов работающая по атрибуту класса
От: Vladek Россия Github
Дата: 08.09.17 17:53
Оценка:
Здравствуйте, 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]: Фабрика классов работающая по атрибуту класса
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.09.17 21:56
Оценка:
Здравствуйте, CyberRussia, Вы писали:

AVK>>И да, лучше не изобретать велосипед, а воспользоваться готовым MEF

CR>Нет смысла тащить экскаватор туда, где достаточно лопаты

Этот экскаватор уже втащен в фреймворк, так что ничего тащить не надо.
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.