Re[6]: Как лучше сделать плагинную систему сегодня?
От: Shmj Ниоткуда  
Дата: 26.12.14 11:47
Оценка:
Здравствуйте, AndrewVK, Вы писали:

S>>Тогда если добавится новый сервис -- пользователю нужно будет скачивать новую версию программы. А хотелось бы, чтобы просто получил с сайта список доступных плагинов и выбрал птичкой какой добавить.


AVK>Это ему точно нужно?


Это открывает возможность создавать свои плагины, зная интерфейс. Плагины может создавать как разработчик основной программы, так и заинтересованные в использовании программы сторонние сервисы.
Re[5]: Как лучше сделать плагинную систему сегодня?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 26.12.14 12:13
Оценка:
Здравствуйте, Shmj, Вы писали:

AVK>>Стандартная компонентная модель его местами использует. А какая поддержка тебе нужна?

S>Любая поддержка.

Какая конкретно?
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[7]: Как лучше сделать плагинную систему сегодня?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 26.12.14 12:13
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Это открывает возможность создавать свои плагины, зная интерфейс. Плагины может создавать как разработчик основной программы, так и заинтересованные в использовании программы сторонние сервисы.


А такие заинтересованные уже есть?
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
AVK Blog
Re[3]: Как лучше сделать плагинную систему сегодня?
От: Shmj Ниоткуда  
Дата: 26.12.14 12:13
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Другое дело, что MEF стоит применять только если не хватает стандартной комбинации IServiceProvider + хелперы для получения стандартных сервисов, иначе оверкилл получается.


А в чем оверкилл? Что может быть проще этого:

public interface ISystem
    {
        void Method1();
    }

    [Export(typeof(ISystem))]
    public class System1 : ISystem
    {
        public void Method1()
        {
            Console.WriteLine("System1");
        }
    }

    class Program
    {
        [ImportMany]
        private IEnumerable<Lazy<ISystem>> _systems;

        public Program()
        {
            var catalog = new AggregateCatalog();
            
            catalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));
            //catalog.Catalogs.Add(new DirectoryCatalog(@"C:\Extensions"));

            try
            {
                new CompositionContainer(catalog).ComposeParts(this);
            }
            catch (CompositionException compositionException)
            {
                Console.WriteLine(compositionException.ToString());
            }
        }

        static void Main(string[] args)
        {
            var p = new Program();

            foreach (var lazy in p._systems)
            {
                lazy.Value.Method1();
            }
        }
    }
Re[4]: Как лучше сделать плагинную систему сегодня?
От: Sinix  
Дата: 26.12.14 12:59
Оценка:
Здравствуйте, Shmj, Вы писали:

S>А в чем оверкилл? Что может быть проще этого:

А теперь раздуй до более-менее реального кода в пару сотен получателей (бизнес-код) и пары десятков предоставляемых сервисов.

Для serviceProvider достаточно прописать только источники и передать всем один и тот же провайдер (например через конструктор). Получатель сам заберёт нужное, тем более что выставляемые интерфейсы документируются через extension-методы к serviceProvider. Для MEF надо или изобретать способ, как передавать каталог, или вытаскивать создание всего, что получает зависимости в отдельный сервис и протаскивать ещё и этот сервис.
Re[7]: Как лучше сделать плагинную систему сегодня?
От: btn1  
Дата: 26.12.14 13:19
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Скачать нужно только ту библиотеку, которая отвечает за досуп к нужному сервису. А вот программу переустанавливать не нужно будет.


Месье первый раз слышит про ДЛЛ? Не надо её устанавливать — просто скачиваешь и перезаписываешь старую. А если совсем по уму, можешь даже rsync заюзать (передавать только бинарные отличия).
Re[5]: Как лучше сделать плагинную систему сегодня?
От: Shmj Ниоткуда  
Дата: 26.12.14 13:35
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Для serviceProvider достаточно прописать только источники и передать всем один и тот же провайдер (например через конструктор). Получатель сам заберёт нужное, тем более что выставляемые интерфейсы документируются через extension-методы к serviceProvider.


А пример можно?
Re[8]: Как лучше сделать плагинную систему сегодня?
От: Shmj Ниоткуда  
Дата: 26.12.14 13:36
Оценка:
Здравствуйте, btn1, Вы писали:

B>Месье первый раз слышит про ДЛЛ? Не надо её устанавливать — просто скачиваешь и перезаписываешь старую.


В таком случае только 1 поставщик программы может добавлять новые сервисы закладок. А что если владелец сервиса закладок (не разработчик программы) захочет написать плагин для программы, чтобы программа умела работать с его сервисом?
Отредактировано 26.12.2014 13:44 Shmj . Предыдущая версия .
Re[6]: Как лучше сделать плагинную систему сегодня?
От: Sinix  
Дата: 26.12.14 14:28
Оценка:
Здравствуйте, Shmj, Вы писали:

S>>Для serviceProvider достаточно прописать только источники и передать всем один и тот же провайдер (например через конструктор). Получатель сам заберёт нужное, тем более что выставляемые интерфейсы документируются через extension-методы к serviceProvider.


S>А пример можно?

Так там всё просто,
IServiceProvider provider = new ServiceProvider()
{
  new MyService(), // : IMyService
  new LoggerService(), // : ILoggerService
  ...
};

...
// где-то в другом месте
IMyService x = provider.GetMyService(); // extension method, == provider.Get<IMyService>();

Собственно, всё. Код пишется за полчаса, потом без ломания контракта прикручивается что угодно, например:
* контексты (новые сервисы, скрытие сервиса на время)
* своя логика создания для отдельных сервисов
* фабрики (для однотипных получателей)
и т.д и т.п.
Отредактировано 26.12.2014 14:30 Sinix . Предыдущая версия .
Re[7]: Как лучше сделать плагинную систему сегодня?
От: Shmj Ниоткуда  
Дата: 26.12.14 15:28
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Так там всё просто,

S>[cs]
S>IServiceProvider provider = new ServiceProvider()
S>{
S> new MyService(), // : IMyService
S> new LoggerService(), // : ILoggerService
S> ...
S>};

Но ведь это не плагинная система. В случае с плагинами -- нужно подключить новый функционал без перекомпиляции.
Re[8]: Как лучше сделать плагинную систему сегодня?
От: Sinix  
Дата: 26.12.14 15:44
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Но ведь это не плагинная система. В случае с плагинами -- нужно подключить новый функционал без перекомпиляции.

Так речь в этой ветке вроде шла о mef вообще, без конкретных сценариев

В теории, ничего не мешает просканировать библиотеки в private bin path и подгрузить из них плагины, но тут мы уже настолько приближаемся к mef, что смысла в своём велосипеде никакого.
Re[9]: Как лучше сделать плагинную систему сегодня?
От: btn1  
Дата: 26.12.14 18:33
Оценка:
Здравствуйте, Shmj, Вы писали:

B>>Месье первый раз слышит про ДЛЛ? Не надо её устанавливать — просто скачиваешь и перезаписываешь старую.

S>В таком случае только 1 поставщик программы может добавлять новые сервисы закладок.

Я отнюдь не по неопытности рекомендую вам самый простейший путь. Конечно же, плагины — вещь намного более гибкая, чем статичная ДЛЛка, но:
1) Судя по вашему топику, с плагинами вы серьёзного дела не имели (но вы понимаете что к чему), поэтому вы затратите приличное количество времени на правильную реализацию (даже с готовыми библиотеками). Хотя это же время можно было бы потратить на более важный функционал.
2) Вряд ли ваш "проект" — нечто серьёзное и большое, поэтому вот это амбициозное "А что если владелец сервиса закладок..." — скорее всего просто мечты. Думаю, наоборот — это ВЫ будете бегать за "владельцами закладок", чтобы расширить применимость своего продукта (какого, кстати, если не секрет?).

Ну и так, в сторону: я не совсем понимаю, в чём у вас вообще сложность — плагины пишут третьекурсники, едва изучив C#! Неужто сами не можете написать элементарный загрузчик ДЛЛек из папки?? Там две функции — загрузить файл и создать экземпляр, чего тут городить-то?
Re[10]: Как лучше сделать плагинную систему сегодня?
От: Shmj Ниоткуда  
Дата: 26.12.14 22:28
Оценка: 30 (1) +2
Здравствуйте, btn1, Вы писали:

B>2) Вряд ли ваш "проект" — нечто серьёзное и большое, поэтому вот это амбициозное "А что если владелец сервиса закладок..." — скорее всего просто мечты. Думаю, наоборот — это ВЫ будете бегать за "владельцами закладок", чтобы расширить применимость своего продукта (какого, кстати, если не секрет?).


Ваш вопрос не по программированию а по жизни. Верь в свою мечту.

Будешь верить -- и не только владельцы сервисов закладок за вами будут бегать. А нет -- то и бегание за владельцами закладок не поможет.

B>Ну и так, в сторону: я не совсем понимаю, в чём у вас вообще сложность — плагины пишут третьекурсники, едва изучив C#! Неужто сами не можете написать элементарный загрузчик ДЛЛек из папки?? Там две функции — загрузить файл и создать экземпляр, чего тут городить-то?


Вручную написать -- не проблема. Много раз делал подобные вещи, в том числе с проверкой подписи плагина и криптованием. У меня опыт коммерческой разработки приближается к 10 годам.

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

Время идет, технологии изменяеются. Я могу чего то не учесть, о чем то не слышать. Нужно выбирать лучшее решение из существующих.
Re[5]: Как лучше сделать плагинную систему сегодня?
От: IB Австрия http://rsdn.ru
Дата: 27.12.14 09:30
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>Она не то чтоб спорна, просто mef под большие проекты заточен. Он же продукт догфудинга, половина функционала в редакторе студии через mef прикручена.

В MEF, к сожалению, не правильная последовательность была — там сначала овердизайн случился, а потом уже догфудинг.
Мы уже победили, просто это еще не так заметно...
Re[11]: Как лучше сделать плагинную систему сегодня?
От: btn1  
Дата: 27.12.14 12:31
Оценка: -1
Здравствуйте, Shmj, Вы писали:

S>Ваш вопрос не по программированию а по жизни. Верь в свою мечту.


Молодой человек, я уже слишком умный и старый, чтобы верить. Для верующих у меня есть единственное верное лекарство. Не поможет — значит это хронический ид... вобщем, не лечится.
РАБОТАТЬ надо, а не верить


S>Будешь верить -- и не только владельцы сервисов закладок за вами будут бегать.


Может, вы ещё верите в сказку "маленький еврейский мальчик разбогател, создав фэйсбук"?? Остыньте, вам это не грозит
Спросите Игоря Сысоева, сколько лет он шёл к банальной продаже своего нгынкса — вот вам _реальная_ история безо всяких загадочных дедушек.

S> А нет -- то и бегание за владельцами закладок не поможет.


Ну да. А плагинная система — поможет.


S>Вручную написать -- не проблема.

S>Но, несмотря на свой опыт, я всегда продолжаю учиться и не гнушаюсь задавать вопросы.

Увы, здесь вы путаете учёбу и технику. Да ещё приправляете это тщеславием.
Есть способ организации программы, при котором части программы выносятся в физически независимые модули, выборочно загружаемые во время работы. Это КОНЦЕПЦИЯ и именно она называется обучением мастерству программирования. А делаете вы это через функцию, МЕФ или КПСС — это техника, всего лишь примитивное освоение инструментария. Если вы понимаете концепцию, все остальные вопросы отпадают сами собой — вы К ЛЮБОМУ инструменту готовы. Но вопрос из топика прозвучал не "какие есть современные концептуальные достижения в области динамической загрузки программ", а банальное "я знаю много умных слов и не знаю какое выбрать".

S>Время идет, технологии изменяеются. Я могу чего то не учесть, о чем то не слышать. Нужно выбирать лучшее решение из существующих.


Это очевидно, неочевидно одно — ваши цели. Если вы двигаете бизнес (или пытаетесь хотя бы стать известным), плагиннная система тут не поможет — это вообще не техническое направление! А если вы хотите стать гуру и что-то там освоить, так и закладки тут не причём — гугл в помощь и корпите над МЕФами, смотрите на функции, варианты использования (особенно интересна в этом плане Visual Studio как IDE). Понимаете, в чём ошибка? Программисты очень любят свою работу, языки, всякие перделки, но в бизнесе они — профаны и за техническими плюшками не видят правильного направления — создают программу ради программы, т.к. фапают на её внутреннее совершенство.
Поставьте правильные цели и всё будет хорошо. Даже без веры.
Re[12]: Как лучше сделать плагинную систему сегодня?
От: Shmj Ниоткуда  
Дата: 28.12.14 01:11
Оценка: +1
Здравствуйте, btn1, Вы писали:

B>РАБОТАТЬ надо, а не верить


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

Если вы привыкли работать по четкой инструкции -- вряд ли.

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

Вот это и называется вера -- гарантий нет, а ты все равно делаешь.

B>Если вы понимаете концепцию, все остальные вопросы отпадают сами собой — вы К ЛЮБОМУ инструменту готовы. Но вопрос из топика прозвучал не "какие есть современные концептуальные достижения в области динамической загрузки программ",


Вы неверно поняли суть вопроса.

B>а банальное "я знаю много умных слов и не знаю какое выбрать".


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

B>Это очевидно, неочевидно одно — ваши цели. Если вы двигаете бизнес (или пытаетесь хотя бы стать известным), плагиннная система тут не поможет — это вообще не техническое направление!


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

Да, реально у меня не сервис закладок, просто подобрал наиболее близкую аналогию, чтобы не отходить от практики.
Отредактировано 28.12.2014 1:13 Shmj . Предыдущая версия . Еще …
Отредактировано 28.12.2014 1:12 Shmj . Предыдущая версия .
Re[13]: Как лучше сделать плагинную систему сегодня?
От: Sinix  
Дата: 28.12.14 14:56
Оценка: +2
Здравствуйте, Shmj, Вы писали:

S>Пытаюсь понять с какой целью вы это пишите.

А посмотрите посты btn1. Он ходит из форума в форум и постит хрень. Иногда получается даже забавно, но спорить точно не надо. Это или троллинг (неудачный), или человек считает нормальным высказывать мнение по темам, в которых он вообще не разбирается
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.