Здравствуйте, AndrewVK, Вы писали:
S>>Тогда если добавится новый сервис -- пользователю нужно будет скачивать новую версию программы. А хотелось бы, чтобы просто получил с сайта список доступных плагинов и выбрал птичкой какой добавить.
AVK>Это ему точно нужно?
Это открывает возможность создавать свои плагины, зная интерфейс. Плагины может создавать как разработчик основной программы, так и заинтересованные в использовании программы сторонние сервисы.
Re[5]: Как лучше сделать плагинную систему сегодня?
Здравствуйте, Shmj, Вы писали:
S>Это открывает возможность создавать свои плагины, зная интерфейс. Плагины может создавать как разработчик основной программы, так и заинтересованные в использовании программы сторонние сервисы.
А такие заинтересованные уже есть?
... << RSDN@Home 1.0.0 alpha 5 rev. 0 on Windows 8 6.2.9200.0>>
Здравствуйте, 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]: Как лучше сделать плагинную систему сегодня?
Здравствуйте, Shmj, Вы писали:
S>А в чем оверкилл? Что может быть проще этого:
А теперь раздуй до более-менее реального кода в пару сотен получателей (бизнес-код) и пары десятков предоставляемых сервисов.
Для serviceProvider достаточно прописать только источники и передать всем один и тот же провайдер (например через конструктор). Получатель сам заберёт нужное, тем более что выставляемые интерфейсы документируются через extension-методы к serviceProvider. Для MEF надо или изобретать способ, как передавать каталог, или вытаскивать создание всего, что получает зависимости в отдельный сервис и протаскивать ещё и этот сервис.
Re[7]: Как лучше сделать плагинную систему сегодня?
Здравствуйте, Shmj, Вы писали:
S>Скачать нужно только ту библиотеку, которая отвечает за досуп к нужному сервису. А вот программу переустанавливать не нужно будет.
Месье первый раз слышит про ДЛЛ? Не надо её устанавливать — просто скачиваешь и перезаписываешь старую. А если совсем по уму, можешь даже rsync заюзать (передавать только бинарные отличия).
Re[5]: Как лучше сделать плагинную систему сегодня?
Здравствуйте, Sinix, Вы писали:
S>Для serviceProvider достаточно прописать только источники и передать всем один и тот же провайдер (например через конструктор). Получатель сам заберёт нужное, тем более что выставляемые интерфейсы документируются через extension-методы к serviceProvider.
А пример можно?
Re[8]: Как лучше сделать плагинную систему сегодня?
Здравствуйте, btn1, Вы писали:
B>Месье первый раз слышит про ДЛЛ? Не надо её устанавливать — просто скачиваешь и перезаписываешь старую.
В таком случае только 1 поставщик программы может добавлять новые сервисы закладок. А что если владелец сервиса закладок (не разработчик программы) захочет написать плагин для программы, чтобы программа умела работать с его сервисом?
Здравствуйте, Shmj, Вы писали:
S>>Для serviceProvider достаточно прописать только источники и передать всем один и тот же провайдер (например через конструктор). Получатель сам заберёт нужное, тем более что выставляемые интерфейсы документируются через extension-методы к serviceProvider.
S>А пример можно?
Так там всё просто,
IServiceProvider provider = new ServiceProvider()
{
new MyService(), // : IMyServicenew LoggerService(), // : ILoggerService
...
};
...
// где-то в другом месте
IMyService x = provider.GetMyService(); // extension method, == provider.Get<IMyService>();
Собственно, всё. Код пишется за полчаса, потом без ломания контракта прикручивается что угодно, например:
* контексты (новые сервисы, скрытие сервиса на время)
* своя логика создания для отдельных сервисов
* фабрики (для однотипных получателей)
и т.д и т.п.
Здравствуйте, Sinix, Вы писали:
S>Так там всё просто, S>[cs] S>IServiceProvider provider = new ServiceProvider() S>{ S> new MyService(), // : IMyService S> new LoggerService(), // : ILoggerService S> ... S>};
Но ведь это не плагинная система. В случае с плагинами -- нужно подключить новый функционал без перекомпиляции.
Re[8]: Как лучше сделать плагинную систему сегодня?
Здравствуйте, Shmj, Вы писали:
S>Но ведь это не плагинная система. В случае с плагинами -- нужно подключить новый функционал без перекомпиляции.
Так речь в этой ветке вроде шла о mef вообще, без конкретных сценариев
В теории, ничего не мешает просканировать библиотеки в private bin path и подгрузить из них плагины, но тут мы уже настолько приближаемся к mef, что смысла в своём велосипеде никакого.
Re[9]: Как лучше сделать плагинную систему сегодня?
Здравствуйте, Shmj, Вы писали:
B>>Месье первый раз слышит про ДЛЛ? Не надо её устанавливать — просто скачиваешь и перезаписываешь старую. S>В таком случае только 1 поставщик программы может добавлять новые сервисы закладок.
Я отнюдь не по неопытности рекомендую вам самый простейший путь. Конечно же, плагины — вещь намного более гибкая, чем статичная ДЛЛка, но:
1) Судя по вашему топику, с плагинами вы серьёзного дела не имели (но вы понимаете что к чему), поэтому вы затратите приличное количество времени на правильную реализацию (даже с готовыми библиотеками). Хотя это же время можно было бы потратить на более важный функционал.
2) Вряд ли ваш "проект" — нечто серьёзное и большое, поэтому вот это амбициозное "А что если владелец сервиса закладок..." — скорее всего просто мечты. Думаю, наоборот — это ВЫ будете бегать за "владельцами закладок", чтобы расширить применимость своего продукта (какого, кстати, если не секрет?).
Ну и так, в сторону: я не совсем понимаю, в чём у вас вообще сложность — плагины пишут третьекурсники, едва изучив C#! Неужто сами не можете написать элементарный загрузчик ДЛЛек из папки?? Там две функции — загрузить файл и создать экземпляр, чего тут городить-то?
Re[10]: Как лучше сделать плагинную систему сегодня?
Здравствуйте, btn1, Вы писали:
B>2) Вряд ли ваш "проект" — нечто серьёзное и большое, поэтому вот это амбициозное "А что если владелец сервиса закладок..." — скорее всего просто мечты. Думаю, наоборот — это ВЫ будете бегать за "владельцами закладок", чтобы расширить применимость своего продукта (какого, кстати, если не секрет?).
Ваш вопрос не по программированию а по жизни. Верь в свою мечту.
Будешь верить -- и не только владельцы сервисов закладок за вами будут бегать. А нет -- то и бегание за владельцами закладок не поможет.
B>Ну и так, в сторону: я не совсем понимаю, в чём у вас вообще сложность — плагины пишут третьекурсники, едва изучив C#! Неужто сами не можете написать элементарный загрузчик ДЛЛек из папки?? Там две функции — загрузить файл и создать экземпляр, чего тут городить-то?
Вручную написать -- не проблема. Много раз делал подобные вещи, в том числе с проверкой подписи плагина и криптованием. У меня опыт коммерческой разработки приближается к 10 годам.
Но, несмотря на свой опыт, я всегда продолжаю учиться и не гнушаюсь задавать вопросы.
Время идет, технологии изменяеются. Я могу чего то не учесть, о чем то не слышать. Нужно выбирать лучшее решение из существующих.
Re[5]: Как лучше сделать плагинную систему сегодня?
Здравствуйте, Sinix, Вы писали:
S>Она не то чтоб спорна, просто mef под большие проекты заточен. Он же продукт догфудинга, половина функционала в редакторе студии через mef прикручена.
В MEF, к сожалению, не правильная последовательность была — там сначала овердизайн случился, а потом уже догфудинг.
Мы уже победили, просто это еще не так заметно...
Re[11]: Как лучше сделать плагинную систему сегодня?
Здравствуйте, Shmj, Вы писали:
S>Ваш вопрос не по программированию а по жизни. Верь в свою мечту.
Молодой человек, я уже слишком умный и старый, чтобы верить. Для верующих у меня есть единственное верное лекарство. Не поможет — значит это хронический ид... вобщем, не лечится.
РАБОТАТЬ надо, а не верить
S>Будешь верить -- и не только владельцы сервисов закладок за вами будут бегать.
S>Вручную написать -- не проблема. S>Но, несмотря на свой опыт, я всегда продолжаю учиться и не гнушаюсь задавать вопросы.
Увы, здесь вы путаете учёбу и технику. Да ещё приправляете это тщеславием.
Есть способ организации программы, при котором части программы выносятся в физически независимые модули, выборочно загружаемые во время работы. Это КОНЦЕПЦИЯ и именно она называется обучением мастерству программирования. А делаете вы это через функцию, МЕФ или КПСС — это техника, всего лишь примитивное освоение инструментария. Если вы понимаете концепцию, все остальные вопросы отпадают сами собой — вы К ЛЮБОМУ инструменту готовы. Но вопрос из топика прозвучал не "какие есть современные концептуальные достижения в области динамической загрузки программ", а банальное "я знаю много умных слов и не знаю какое выбрать".
S>Время идет, технологии изменяеются. Я могу чего то не учесть, о чем то не слышать. Нужно выбирать лучшее решение из существующих.
Это очевидно, неочевидно одно — ваши цели. Если вы двигаете бизнес (или пытаетесь хотя бы стать известным), плагиннная система тут не поможет — это вообще не техническое направление! А если вы хотите стать гуру и что-то там освоить, так и закладки тут не причём — гугл в помощь и корпите над МЕФами, смотрите на функции, варианты использования (особенно интересна в этом плане Visual Studio как IDE). Понимаете, в чём ошибка? Программисты очень любят свою работу, языки, всякие перделки, но в бизнесе они — профаны и за техническими плюшками не видят правильного направления — создают программу ради программы, т.к. фапают на её внутреннее совершенство.
Поставьте правильные цели и всё будет хорошо. Даже без веры.
Re[12]: Как лучше сделать плагинную систему сегодня?
Здравствуйте, btn1, Вы писали:
B>РАБОТАТЬ надо, а не верить
Вы за свою богатую жизнь сколько раз рискнули и попытались сделать свой проект, без знания всех деталей достижения успеха? Не имея инструкции.
Если вы привыкли работать по четкой инструкции -- вряд ли.
Во многих случаях нет инструкции и невозможно вычислить математически каким будет итог, невозможно предвидеть все нюансы.
Вот это и называется вера -- гарантий нет, а ты все равно делаешь.
B>Если вы понимаете концепцию, все остальные вопросы отпадают сами собой — вы К ЛЮБОМУ инструменту готовы. Но вопрос из топика прозвучал не "какие есть современные концептуальные достижения в области динамической загрузки программ",
Вы неверно поняли суть вопроса.
B>а банальное "я знаю много умных слов и не знаю какое выбрать".
Пытаюсь понять с какой целью вы это пишите. То ли утвердитсья хотите за счет унижения других. То ли папа в детстве над вами издевался и теперь вы не упускаете случая задеть других?
B>Это очевидно, неочевидно одно — ваши цели. Если вы двигаете бизнес (или пытаетесь хотя бы стать известным), плагиннная система тут не поможет — это вообще не техническое направление!
Я вам привел пример с сервисом закладок и подключением функционала без выпуска новой версии программы.
Да, реально у меня не сервис закладок, просто подобрал наиболее близкую аналогию, чтобы не отходить от практики.
Здравствуйте, Shmj, Вы писали:
S>Пытаюсь понять с какой целью вы это пишите.
А посмотрите посты btn1. Он ходит из форума в форум и постит хрень. Иногда получается даже забавно, но спорить точно не надо. Это или троллинг (неудачный), или человек считает нормальным высказывать мнение по темам, в которых он вообще не разбирается