{"id":27175,"date":"2020-03-18T00:00:00","date_gmt":"2020-03-17T23:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=27175"},"modified":"2021-01-13T09:40:11","modified_gmt":"2021-01-13T08:40:11","slug":"caricare-plugin-in-applicazioni-net","status":"publish","type":"post","link":"https:\/\/blexin.com\/it\/blog\/caricare-plugin-in-applicazioni-net\/","title":{"rendered":"Caricare plugin in applicazioni .NET"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" data-attachment-id=\"27176\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/caricare-plugin-in-applicazioni-net\/attachment\/top00-4\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-4.png?fit=1024%2C608&amp;ssl=1\" data-orig-size=\"1024,608\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"top00-4\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-4.png?fit=1024%2C608&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-4.png?resize=1024%2C608&#038;ssl=1\" alt=\"\" class=\"wp-image-27176\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-4.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-4-980x582.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-4-480x285.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Durante lo sviluppo del nostro CMS WebRight, \u00e8 nata l\u2019esigenza di permettere a persone esterne al team di sviluppare componenti aggiuntive. Ho pensato potesse essere interessante raccontarvi come abbiamo affrontato il problema, mostrandovi come sviluppare un sistema a plug-in per le vostre applicazioni .NET.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il primo problema da risolvere \u00e8 stato riconoscere i plugin tra gli assembly caricati. Nel nostro caso, abbiamo utilizzato un\u2019interfaccia che permette, a chi la implementa, di definire quello che per noi \u00e8 un plugin. Dato che WebRight \u00e8 basato su un nostro framework chiamato Raptor, l\u2019interfaccia si chiama&nbsp;<strong>IRaptorPlugin<\/strong>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic interface IRaptorPlugin\n{\n\u00a0\u00a0\u00a0\u00a0string Name { get; }\n\u00a0\n\u00a0\u00a0\u00a0\u00a0string Version { get; }\n\u00a0\n\u00a0\u00a0\u00a0\u00a0void OnLoad();\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Se, ad esempio, vogliamo creare un plugin per la gestione di un menu, creiamo una libreria contenente una classe che implementa l\u2019interfaccia:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic class MenuPlugin : IRaptorPlugin\n{\n\u00a0\u00a0\u00a0\u00a0public string Name =&gt; &quot;Menu&quot;;\n\u00a0\n\u00a0\u00a0\u00a0\u00a0public string Version =&gt; &quot;1.0.0&quot;\n\u00a0\n\u00a0\u00a0\u00a0\u00a0public void OnLoad()\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">A questo punto, siamo gi\u00e0 in grado di caricare il plugin nel CMS, riconoscendo questa classe grazie alla&nbsp;<a rel=\"noreferrer noopener\" href=\"https:\/\/www.blexin.com\/it-IT\/Article\/Blog\/Migliora-il-tuo-codice-con-la-Reflection-52\" target=\"_blank\">Reflection<\/a>. Abbiamo quindi creato un plugin manager che fa il lavoro sporco per noi, di cui vi riporto una versione semplificata per evidenziare i punti salienti:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic class RaptorPluginManager : IRaptorPluginManager\n{\n\u00a0\u00a0\u00a0\u00a0public ICollection&lt;Assembly&gt; Plugins { get; private set; }\n\u00a0\n\u00a0\n\u00a0\u00a0\u00a0\u00a0public RaptorPluginManager(string path, IServiceCollection services)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.Plugins = new List&lt;Assembly&gt;();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0string&#x5B;] dlls = Directory.GetFiles(path, &quot;*.dll&quot;, SearchOption.AllDirectories);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0foreach (var dll in dlls)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var plugin = Assembly.LoadFrom(dll);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var pluginClass = plugin.GetTypes().Where(x =&gt; typeof(IRaptorPlugin).IsAssignableFrom(x)).SingleOrDefault();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (pluginClass != null)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var pluginInstance = Activator.CreateInstance(pluginClass);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var loadMethod = pluginClass.GetMethod(&quot;OnLoad&quot;);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0loadMethod.Invoke(pluginInstance, null);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0this.Plugins.Add(plugin);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Questo codice non fa altro che cercare tutte le DLL in una cartella specificata e, per ogni elemento trovato, verificare se \u00e8 presente un\u2019 implementazione di&nbsp;<strong>IRaptorPlugin.&nbsp;<\/strong>Per ciascuna di tali implementazioni, viene eseguito il metodo&nbsp;<strong>OnLoad,<\/strong>&nbsp;che pu\u00f2 essere utilizzato per popolare qualche configurazione o per effettuare per un&nbsp;<em>seed<\/em>&nbsp;di dati, e viene poi collezionata in una lista di plugin.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una volta che abbiamo la lista, possiamo caricare funzionalit\u00e0 specifiche del framework. Nel nostro caso, parlando di un CMS, abbiamo definito i concetti di&nbsp;<strong>Page<\/strong>&nbsp;e&nbsp;<strong>Widget<\/strong>, il primo per visualizzare una pagina di contenuti, il secondo per mostrare una particolare sezione di contenuto all\u2019interno di una pagina. Nell\u2019implementazione di WebRight in ASP.NET Core, una Page \u00e8 una&nbsp;<em>View<\/em>&nbsp;di MVC, a cui possiamo arrivare direttamente tramite una specifica rotta, mentre una widget \u00e8 un&nbsp;<em>ViewComponent&nbsp;<\/em>(trovate la definizione nel mio&nbsp;<a href=\"https:\/\/www.blexin.com\/it-IT\/Article\/Blog\/Kestrel-lanciami-i-componenti-31\" target=\"_blank\" rel=\"noreferrer noopener\">articolo<\/a>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Completiamo quindi il nostro plugin col codice per inserire un widget Menu.Ricalcando lo stesso meccanismo usato per il concetto di plugin, una widget \u00e8 una classe che implementa una specifica interfaccia, che nel nostro caso si chiama&nbsp;<strong>IWebRightWidget<\/strong>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic interface IWebRightWidget\n{\n\u00a0\u00a0\u00a0\u00a0IWebRightBaseViewModel GetViewModel(string language, object&#x5B;] parameters);\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Questa interfaccia non solo&nbsp;<em>marca&nbsp;<\/em>una classe come widget di WebRight, ma permette anche di definire come vengono recuperati i dati necessari al suo funzionamento, che verranno poi riversati in un classico&nbsp;<em>ViewModel<\/em>. Se ad esempio i dati per la widget di un menu vengono definiti all\u2019interno di una classe&nbsp;<strong>WebRightMenuViewModel<\/strong>, che estender\u00e0 una classe base del framework o implementer\u00e0 direttamente&nbsp;<strong>IWebRightBaseViewModel,<\/strong>&nbsp;l\u2019implementazione della widget somiglier\u00e0 a qualcosa del genere:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic class WebRightMenuWidget : IWebRightWidget\n{\n\u00a0\u00a0\u00a0\u00a0public IRaptorBaseViewModel GetViewModel(string language, object&#x5B;] parameters)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0WebRightMenuViewModel vm = new WebRightMenuViewModel();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u2026 view model fill logic ...\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return vm; \n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Come fa il framework a sapere che nel plugin \u00e8 presente una widget? WebRight definisce una&nbsp;<strong>WidgetFactory<\/strong>&nbsp;che contiene un metodo che, dato il nome della widget, ne verifica l\u2019esistenza e la restituisce al chiamante che provveder\u00e0 a visualizzarla:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic IWebRightWidget GetWidgetByName(string name)\n{\n\u00a0\u00a0\u00a0\u00a0if (cache.Exists(name))\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return cache.Get&lt;IWebRightWidget&gt;(name);\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0else\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var widgetType = pluginManager.Plugins.GetTypes()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.Where(y =&gt; typeof(IWebRightWidget).IsAssignableFrom(y) &amp;&amp; y.Name == name)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.FirstOrDefault();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (widgetType != null)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var widget = (IWebRightWidget)this.serviceProvider.GetService(widgetType);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cache.Add&lt;IWebRightWidget&gt;(widget, name);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return widget;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0foreach (var plugin in this.pluginManager.Plugins)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0widgetType = plugin.GetTypes()\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.Where(y =&gt; typeof(IWebRightWidget).IsAssignableFrom(y) &amp;&amp; y.Name == name)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.FirstOrDefault();\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (widgetType != null)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var widget = (IWebRightWidget)this.serviceProvider.GetService(widgetType);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cache.Add&lt;IWebRightWidget&gt;(widget, name);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return widget;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throw new WebRightWidgetNotFoundException(name);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Il metodo va a verificare se tra i plugin esposti dal PluginManager \u00e8 presente la widget richiesta. Se la trova, la aggiunge in una cache per velocizzare richieste successive e la restituisce; in caso contrario viene sollevata una eccezione.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Come potete vedere, si tratta semplicemente di stabilire delle convenzioni e usare la Reflection di .NET, ottimizzando le performance facendo uso della cache. Il codice che abbiamo in produzione \u00e8 ovviamente un po\u2019 pi\u00f9 complesso di cos\u00ec, ma l\u2019idea di base \u00e8 quella esposta. Se siete curiosi di sapere come poi il widget viene visualizzato, potete leggere un mio precedente&nbsp;<a href=\"https:\/\/www.blexin.com\/it-IT\/Article\/Blog\/Kestrel-lanciami-i-componenti-31\" target=\"_blank\" rel=\"noreferrer noopener\">articolo<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alla prossima!<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Vediamo come aggiungere un meccanismo a plugin in un&#8217;applicazione .NET Core<\/p>\n","protected":false},"author":196716246,"featured_media":27176,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_crdt_document":"","inline_featured_image":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[688637374],"tags":[688637414,688637382,688637442,688637441],"class_list":["post-27175","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-asp-net-core","tag-c","tag-raptor","tag-webright"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Caricare plugin in applicazioni .NET - Blexin<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blexin.com\/it\/blog\/caricare-plugin-in-applicazioni-net\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Caricare plugin in applicazioni .NET - Blexin\" \/>\n<meta property=\"og:description\" content=\"Vediamo come aggiungere un meccanismo a plugin in un&#039;applicazione .NET Core\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/it\/blog\/caricare-plugin-in-applicazioni-net\/\" \/>\n<meta property=\"og:site_name\" content=\"Blexin\" \/>\n<meta property=\"article:published_time\" content=\"2020-03-17T23:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-01-13T08:40:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-4.png?fit=1024%2C608\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"608\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Francesco de Vicariis\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Francesco de Vicariis\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/caricare-plugin-in-applicazioni-net\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/caricare-plugin-in-applicazioni-net\\\/\"},\"author\":{\"name\":\"Francesco de Vicariis\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/6f8514ed8b0d3be31369ca5436c4781f\"},\"headline\":\"Caricare plugin in applicazioni .NET\",\"datePublished\":\"2020-03-17T23:00:00+00:00\",\"dateModified\":\"2021-01-13T08:40:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/caricare-plugin-in-applicazioni-net\\\/\"},\"wordCount\":584,\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/caricare-plugin-in-applicazioni-net\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/top00-4.png?fit=1024%2C608&ssl=1\",\"keywords\":[\"Asp.net core\",\"C#\",\"Raptor\",\"Webright\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/caricare-plugin-in-applicazioni-net\\\/\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/caricare-plugin-in-applicazioni-net\\\/\",\"name\":\"Caricare plugin in applicazioni .NET - Blexin\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/caricare-plugin-in-applicazioni-net\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/caricare-plugin-in-applicazioni-net\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/top00-4.png?fit=1024%2C608&ssl=1\",\"datePublished\":\"2020-03-17T23:00:00+00:00\",\"dateModified\":\"2021-01-13T08:40:11+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/6f8514ed8b0d3be31369ca5436c4781f\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/caricare-plugin-in-applicazioni-net\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/caricare-plugin-in-applicazioni-net\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/caricare-plugin-in-applicazioni-net\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/top00-4.png?fit=1024%2C608&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/top00-4.png?fit=1024%2C608&ssl=1\",\"width\":1024,\"height\":608},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/caricare-plugin-in-applicazioni-net\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blexin.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Caricare plugin in applicazioni .NET\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/\",\"name\":\"Blexin\",\"description\":\"Con noi \u00e8 semplice\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blexin.com\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/6f8514ed8b0d3be31369ca5436c4781f\",\"name\":\"Francesco de Vicariis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b3a3164fd0b28d429cd427aafae38a687a41a250a2bccf4ab3b0744138afd64e?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b3a3164fd0b28d429cd427aafae38a687a41a250a2bccf4ab3b0744138afd64e?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b3a3164fd0b28d429cd427aafae38a687a41a250a2bccf4ab3b0744138afd64e?s=96&d=identicon&r=g\",\"caption\":\"Francesco de Vicariis\"},\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/author\\\/francesco-devicariisblexin-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Caricare plugin in applicazioni .NET - Blexin","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blexin.com\/it\/blog\/caricare-plugin-in-applicazioni-net\/","og_locale":"it_IT","og_type":"article","og_title":"Caricare plugin in applicazioni .NET - Blexin","og_description":"Vediamo come aggiungere un meccanismo a plugin in un'applicazione .NET Core","og_url":"https:\/\/blexin.com\/it\/blog\/caricare-plugin-in-applicazioni-net\/","og_site_name":"Blexin","article_published_time":"2020-03-17T23:00:00+00:00","article_modified_time":"2021-01-13T08:40:11+00:00","og_image":[{"width":1024,"height":608,"url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-4.png?fit=1024%2C608","type":"image\/png"}],"author":"Francesco de Vicariis","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Francesco de Vicariis","Tempo di lettura stimato":"4 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/it\/blog\/caricare-plugin-in-applicazioni-net\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/it\/blog\/caricare-plugin-in-applicazioni-net\/"},"author":{"name":"Francesco de Vicariis","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/6f8514ed8b0d3be31369ca5436c4781f"},"headline":"Caricare plugin in applicazioni .NET","datePublished":"2020-03-17T23:00:00+00:00","dateModified":"2021-01-13T08:40:11+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/caricare-plugin-in-applicazioni-net\/"},"wordCount":584,"image":{"@id":"https:\/\/blexin.com\/it\/blog\/caricare-plugin-in-applicazioni-net\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-4.png?fit=1024%2C608&ssl=1","keywords":["Asp.net core","C#","Raptor","Webright"],"articleSection":["Blog"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/it\/blog\/caricare-plugin-in-applicazioni-net\/","url":"https:\/\/blexin.com\/it\/blog\/caricare-plugin-in-applicazioni-net\/","name":"Caricare plugin in applicazioni .NET - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/caricare-plugin-in-applicazioni-net\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/it\/blog\/caricare-plugin-in-applicazioni-net\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-4.png?fit=1024%2C608&ssl=1","datePublished":"2020-03-17T23:00:00+00:00","dateModified":"2021-01-13T08:40:11+00:00","author":{"@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/6f8514ed8b0d3be31369ca5436c4781f"},"breadcrumb":{"@id":"https:\/\/blexin.com\/it\/blog\/caricare-plugin-in-applicazioni-net\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/it\/blog\/caricare-plugin-in-applicazioni-net\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/blog\/caricare-plugin-in-applicazioni-net\/#primaryimage","url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-4.png?fit=1024%2C608&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-4.png?fit=1024%2C608&ssl=1","width":1024,"height":608},{"@type":"BreadcrumbList","@id":"https:\/\/blexin.com\/it\/blog\/caricare-plugin-in-applicazioni-net\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/it\/"},{"@type":"ListItem","position":2,"name":"Caricare plugin in applicazioni .NET"}]},{"@type":"WebSite","@id":"https:\/\/blexin.com\/it\/#website","url":"https:\/\/blexin.com\/it\/","name":"Blexin","description":"Con noi \u00e8 semplice","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blexin.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/6f8514ed8b0d3be31369ca5436c4781f","name":"Francesco de Vicariis","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/b3a3164fd0b28d429cd427aafae38a687a41a250a2bccf4ab3b0744138afd64e?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/b3a3164fd0b28d429cd427aafae38a687a41a250a2bccf4ab3b0744138afd64e?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b3a3164fd0b28d429cd427aafae38a687a41a250a2bccf4ab3b0744138afd64e?s=96&d=identicon&r=g","caption":"Francesco de Vicariis"},"url":"https:\/\/blexin.com\/it\/author\/francesco-devicariisblexin-com\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/top00-4.png?fit=1024%2C608&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/pcyUBx-74j","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/27175","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/users\/196716246"}],"replies":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/comments?post=27175"}],"version-history":[{"count":5,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/27175\/revisions"}],"predecessor-version":[{"id":27804,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/27175\/revisions\/27804"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media\/27176"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media?parent=27175"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/categories?post=27175"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/tags?post=27175"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}