pano1974
10-03-2014, 20:17
Ciao a tutti.
Volendo rifare un vecchio programmino ho colto l'occasione per imparare MEF e la modularità.
Mi sono preso il mio buon vecchio libro di C# e Framework4 e ho cominciato a studiarlo.Dalla rete ho scaricato un programma dimostrativo per vedere come è composto il codice e cercare di capire un pò di più 'sto benedetto mef.
Provo a scrivere un sw di mio pugno per adattarlo alle mie esigenze ma qua cominciano i problemi.
In pratica il mio sw carica le Part nel Catalog ma non mi riempie il container.
Il sw è suddiviso in vari progetti come riportato di seguito:
Contratto.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Contracts
{
public interface ITipiProtocolli
{
List<string> ElencoProtocolli();
}
public interface ITipo
{
string TipoProtocollo { get; }
}
public interface INomeProtocollo
{
string NomeProtocollo { get; }
}
}
ElencoProtocolli.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using Contracts;
namespace ElencoProtocolli
{
[Export(typeof(ITipiProtocolli))]
public class ElencoProtocolli : ITipiProtocolli
{
[ImportMany(typeof(ITipo))]
IEnumerable<Lazy<ITipo, INomeProtocollo>> protocolli;
List<string> ITipiProtocolli.ElencoProtocolli()
{
List<string> str = new List<string>();
foreach (Lazy<ITipo, INomeProtocollo> p in protocolli)
{
str.Add(p.Metadata.NomeProtocollo + " " + p.Value);
}
return str;
}
}
}
Mef1.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.ComponentModel.Composition;
using Contracts;
namespace Export1
{
[Export(typeof(ITipo))]
[ExportMetadata("Protocollo", "X21")]
public class Mef1 : Contracts.ITipo
{
public string TipoProtocollo
{
get { return "X21"; }
}
}
}
Mef2.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.ComponentModel.Composition;
using Contracts;
namespace Export2
{
[Export(typeof(ITipo))]
[ExportMetadata("Protocollo", "MODBUS")]
public class Mef2 : Contracts.ITipo
{
public string TipoProtocollo
{
get { return "Modbus"; }
}
}
}
MainWindows.xaml.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel.Composition.Hosting;
using System.ComponentModel.Composition;
using System.Reflection;
using Contracts;
namespace WpfApplication1
{
/// <summary>
/// Logica di interazione per MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
[Import]
public ITipiProtocolli protocol;
private CompositionContainer _container;
public MainWindow()
{
InitializeComponent();
//An aggregate catalog that combines multiple catalogs
var catalog = new AggregateCatalog();
string s;
s = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); ;
catalog.Catalogs.Add(new DirectoryCatalog(s));
_container = new CompositionContainer(catalog);
//Fill the imports of this object
try
{
this._container.ComposeParts(this);
tb1.Text += "\nPath: " + s;
}
catch (CompositionException compositionException)
{
tb1.Text = compositionException.Errors.ToString();
tb1.Text += "\n" + compositionException.ToString();
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (protocol.ElencoProtocolli().Count == 0)
{
tb1.Text += "\n"+"Numero Protocolli = 0";
}
foreach (string s in protocol.ElencoProtocolli())
{
tb1.Text += "\n" + s;
}
for (int i = 0; i < _container.Catalog.Parts.Count(); i++)
{
tb1.Text+="\n"+_container.Catalog.Parts.ElementAt(i);
}
}
}
}
Se qualcuno può spiegarmi dove sbaglio ringrazio anticipatamente.
Volendo rifare un vecchio programmino ho colto l'occasione per imparare MEF e la modularità.
Mi sono preso il mio buon vecchio libro di C# e Framework4 e ho cominciato a studiarlo.Dalla rete ho scaricato un programma dimostrativo per vedere come è composto il codice e cercare di capire un pò di più 'sto benedetto mef.
Provo a scrivere un sw di mio pugno per adattarlo alle mie esigenze ma qua cominciano i problemi.
In pratica il mio sw carica le Part nel Catalog ma non mi riempie il container.
Il sw è suddiviso in vari progetti come riportato di seguito:
Contratto.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Contracts
{
public interface ITipiProtocolli
{
List<string> ElencoProtocolli();
}
public interface ITipo
{
string TipoProtocollo { get; }
}
public interface INomeProtocollo
{
string NomeProtocollo { get; }
}
}
ElencoProtocolli.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using Contracts;
namespace ElencoProtocolli
{
[Export(typeof(ITipiProtocolli))]
public class ElencoProtocolli : ITipiProtocolli
{
[ImportMany(typeof(ITipo))]
IEnumerable<Lazy<ITipo, INomeProtocollo>> protocolli;
List<string> ITipiProtocolli.ElencoProtocolli()
{
List<string> str = new List<string>();
foreach (Lazy<ITipo, INomeProtocollo> p in protocolli)
{
str.Add(p.Metadata.NomeProtocollo + " " + p.Value);
}
return str;
}
}
}
Mef1.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.ComponentModel.Composition;
using Contracts;
namespace Export1
{
[Export(typeof(ITipo))]
[ExportMetadata("Protocollo", "X21")]
public class Mef1 : Contracts.ITipo
{
public string TipoProtocollo
{
get { return "X21"; }
}
}
}
Mef2.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.ComponentModel.Composition;
using Contracts;
namespace Export2
{
[Export(typeof(ITipo))]
[ExportMetadata("Protocollo", "MODBUS")]
public class Mef2 : Contracts.ITipo
{
public string TipoProtocollo
{
get { return "Modbus"; }
}
}
}
MainWindows.xaml.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.ComponentModel.Composition.Hosting;
using System.ComponentModel.Composition;
using System.Reflection;
using Contracts;
namespace WpfApplication1
{
/// <summary>
/// Logica di interazione per MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
[Import]
public ITipiProtocolli protocol;
private CompositionContainer _container;
public MainWindow()
{
InitializeComponent();
//An aggregate catalog that combines multiple catalogs
var catalog = new AggregateCatalog();
string s;
s = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); ;
catalog.Catalogs.Add(new DirectoryCatalog(s));
_container = new CompositionContainer(catalog);
//Fill the imports of this object
try
{
this._container.ComposeParts(this);
tb1.Text += "\nPath: " + s;
}
catch (CompositionException compositionException)
{
tb1.Text = compositionException.Errors.ToString();
tb1.Text += "\n" + compositionException.ToString();
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (protocol.ElencoProtocolli().Count == 0)
{
tb1.Text += "\n"+"Numero Protocolli = 0";
}
foreach (string s in protocol.ElencoProtocolli())
{
tb1.Text += "\n" + s;
}
for (int i = 0; i < _container.Catalog.Parts.Count(); i++)
{
tb1.Text+="\n"+_container.Catalog.Parts.ElementAt(i);
}
}
}
}
Se qualcuno può spiegarmi dove sbaglio ringrazio anticipatamente.