Wilfried Woivré & .Net

ASP.Net & Unity : Gestion des contrôleurs

JANV3

Dans un article précédent, je vous ai montré comment injecter vos différentes dépendances via Unity en utilisant plusieurs techniques. Si depuis, vous avez voulu essayer en ASP.Net MVC, vous vous êtes surement aperçu que l'on ne peut pas directement résoudre nos dépendances puisque la création des différents contrôleurs est par défaut géré par le Framework.

Donc avant de voir comment modifier cela, il faut comprendre comment une page est construite. (Image issue de : http://msdn.microsoft.com/en-us/magazine/dd695917.aspx)

image

 

On peut donc voir que lors du Worflow de création d’une page ASP.Net MVC, le MvcHandler interagit avec le IControllerFactory qui va lui fournir le, ou les, instances de IController qui correspondent, soient nos contrôleurs que nous utilisons en ASP.Net MVC. Et bien entendu, vous pouvez redéfinir vous même votre propre fabrique afin de pouvoir y placer la création de vos contrôleurs via Unity.

 

Déjà commençons par créer notre classe qui enregistre notre Container Unity :

public class UnityRoot
{
    private readonly static IUnityContainer _container = new UnityContainer();

    internal  static void EnsureInitialized()
    {
        
    }

    static UnityRoot()
    {
        Configure(_container);
        var controllerFactory = new UnityControllerFactory(_container);
        ControllerBuilder.Current.SetControllerFactory(controllerFactory);
    }

    private static void Configure(IUnityContainer container)
    {
        container.RegisterType<Interface1, ClassImpl1>();
        container.RegisterType<Interface2, ClassImpl2>();
    }
}

 

Ensuite, comme on peut le voir aux lignes 13 et 14, je créé une instance de IUnityControllerFactory qui va gérer la création des différents contrôleurs.

public class UnityControllerFactory : DefaultControllerFactory
{
    private IUnityContainer container;

    public UnityControllerFactory(IUnityContainer container)
    {
        this.container = container;
    }

    protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
    {
        IController controller;
        if (controllerType == null)
            throw new HttpException(404, String.Format("The controller for path '{0}' could not be found" +
                "or it does not implement IController.", requestContext.HttpContext.Request.Path));

        if (!typeof(IController).IsAssignableFrom(controllerType))
            throw new ArgumentException(string.Format("Type requested is not a controller: {0}", controllerType.Name), "controllerType");
        try
        {
            controller = container.Resolve(controllerType) as IController;
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException(String.Format("Error resolving controller {0}", controllerType.Name), ex);
        }
        return controller;
    }
}

Et voilà, uniquement en surchargeant la méthode GetControllerInstance, vous pouvez modifier la création de vos contrôleurs, ici en ajoutant les différentes implémentations de Interface1 et Interface2.

 

Voici les sources de l’application avec laquelle j’ai fait cet article.

 

Et merci à Julien Corioland de m’avoir donné cette astuce.

Remonter

MVVM Template en WPF et Silverlight

JUIL31

Bonjour à tous,

Alors je publie cet article vu le nombre de personne qui visitent mon blog pour les données sur le MVVM, j’espère avant tout qu’elles vous sont précieuses !

En fait durant mes différentes recherches sur le MVVM, principalement sur des projets de template pour réaliser des démonstrations, ou pour créer des projets plus rapidement avant de décider à implémenter mon propre projet de Template qui sera peut être publié un jour (si vous êtes sages !)

 

Vous pouvez donc retrouver un très bon Template sur le MVVM sur le site de codeplex à l’adresse : http://wpf.codeplex.com

 

Maintenant pour Silverlight et WPF, vous avez celui sur le site de Galasoft : http://www.galasoft.ch/mvvm/install/publish.html 

Alors rapidement avant que je ne vois des gens choqués sur mon blog, ces deux templates référence une dll de Galasoft, qui gère le MVVM, néanmoins si vous n’avez pas besoin de changer le comportement de son Toolkit, il suffit amplement pour des projets d’entreprise et de démonstration entre autre. Cependant voici un aperçu de sa dll : http://www.galasoft.ch/mvvm/getstarted/

 

Et voilà, en espérant que cela vous sera utile pour des développements futurs !

Remonter

Migrer une application ASP.Net MVC sous Windows Azure

JUIL4

Dans cet article, nous allons voir comment placer une application ASP.Net MVC totalement sous Windows Azure.

Pour cette démonstration, je vais prendre mon projet ASP.Net MVC “Notes” sans la version Silverlight, vous pouvez le retrouver sur cet article.

Maintenant passons à notre projet Azure, donc après avoir installer le SDK si ce n’est déjà fait, nous allons créer un projet Azure vierge comme cela :

image

Maintenant nous allons ajouté notre projet ASP.Net MVC à la solution, afin qu'on puisse le placer dans Azure.

Donc première étape, faire du projet ASP.Net MVC un Web Role pour Azure, parce que dans l’état actuel des choses, il n’est pas possible d’associer notre projet à notre Cloud Service, comme on peut le voir.

imageDonc pour ceux qui ont déjà eu à faire des choses comme cela il faut éditer le csproj de la solution “Notes”, soit le projet ASP.Net MVC afin d’incorporer le texte suivant en dessous du “TargetFramework”

<RoleType>Web</RoleType>
<ServiceHostingSDKInstallDir Condition=" '$(ServiceHostingSDKInstallDir)' == '' ">
$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\ServiceHosting\v1.0@InstallPath
</ServiceHostingSDKInstallDir>

 

Puis vous recharger votre solution si vous n’avez pas fermer Visual Studio, et là on peut voir qu’il détecte bien un Web Role dans la solution.

image

Bon maintenant qu’on a ajouté notre Web Role à notre application, il faut maintenant modifier et configurer celui ci pour qu’il marche sous Azure, car pour rappel, dans le projet initial, on accéder à la base de données grâce à Entity Framework, donc il va nous falloir refaire la partie model de l’application.

Mais avant tout, configurons notre application pour qu’elle tourne sur la fabrique Azure installé en local sur notre machine. Il y a deux fichiers à configurer qui sont ServiceDefinition.csdef, et ServiceConfiguration.cscfg. Ces deux fichiers comme leurs noms le laissent envisager permettent de configurer notre application pour qu’elle puisse fonctionner soit avec des composants installer en local sur votre machine, soit avec un compte Windows Azure.

Donc maintenant passons à notre modèle de données à modifier, il va nous falloir gérer une table “Note” avec un libellé et une date de saisie ainsi qu’un Id unique.

La première problématique est donc de créer notre table, et bien en fait il n’y a rien de plus simple, enfin si vous avez regardé rapidement les démos fournis par le SDK, vous avez du voir un projet StorageClient qui permet entre autre de créer les tables pour Azure.

public class Note : TableStorageEntity
{
    public int Id { get; set; }
    public DateTime DateSaisie { get; set; }
    public String Libelle { get; set; }

    public Note(int id, DateTime dateSaisie, String libelle)
    {
        Id = id;
        DateSaisie = dateSaisie;
        Libelle = libelle;

        PartitionKey = String.Concat(Id, '_', Libelle);
        RowKey = String.Format("{0:10}", DateTime.Now.Ticks);
    }

    public Note() { }
} 

Voici, par exemple, la Table Note, elle contiendra nos champs, tel qu’il était avant, soit l’Id, la DateSaisie et le Libelle. Mais en plus elle aura des champs spécifiques à Azure que nous verrons par la suite.

Bon maintenant qu’on a crée notre table, il faut créer un contexte pour regrouper ces tables.

public class NoteService : TableStorageDataServiceContext, INoteService
{
    private static StorageAccountInfo account
    {
        get
        {
            var accountInfo = StorageAccountInfo.GetAccountInfoFromConfiguration("TableStorageEndpoint");
            if (accountInfo == null)
            {
                return null;
            }
            return accountInfo;
        }
    }

    public IQueryable<Note> Notes
    {
        get { return CreateQuery<Note>("Notes"); }
    }

    public NoteService() : base(account) { }

 

Donc comme vous pouvez le voir, la création d’un contexte sous Azure n’est pas très compliqué, il suffit de récupérer le StorageAccountInfo que nous avons rempli précédemment dans nos fichiers de config pour le Service Azure, et de créer un IQueryable<Note> . Après cela on crée nos tables de tests grâce à cette option:

imageOn obtient, si tout s’est correctement passé la création de notre base de données “AzureNotes” qui contient notre Table “Notes”

Attention, il faut que votre projet compile pour créer les “Test Storage Tables” !!

image       image

On peut voir ainsi que dans notre Table, le SDK d’Azure nous a rajouté 3 champs qui sont Timestamp, PartitiionKey et RowKey, de plus ces deux derniers constituent la clé primaire de notre table “Notes”, c’est donc pour cela que je les initialise dans le le constructeur de ma classe Note.

Donc récapitulons, où on en est, on a migrer notre application sous Azure, et on a crée notre base de données de tests sur notre poste, il ne nous reste plus qu’à modifier notre partie de Service pour ne pas perdre en fonctionnalité !

public IEnumerable<Note> ListNotes()
 {
     return Notes.AsEnumerable();
 }

 public Note GetNote(int id)
 {
     return (from n in Notes
             where n.Id == id
             select n).FirstOrDefault();
 }

 public void CreateNote(Note noteToCreate)
 {
     try
     {
         Note n = new Note(Notes.AsEnumerable().Count() + 1, noteToCreate.DateSaisie, noteToCreate.Libelle);
         this.AddObject("Notes", n);
         this.SaveChanges();
     }
     catch (DataServiceRequestException dsre)
     {
         RoleManager.WriteToLog("Information", "NoteService, CreateNote : Entry already exists");
     }
     catch (InvalidOperationException ioe)
     {
         RoleManager.WriteToLog("Information", "NoteService : Implementation Error");
     }
 }

 public void EditNote(Note noteToEdit)
 {
     Note originalNote = GetNote(noteToEdit.Id);

     originalNote.Libelle = noteToEdit.Libelle;
     originalNote.DateSaisie = noteToEdit.DateSaisie;
     this.UpdateObject(originalNote);
     this.SaveChanges();
 }

 public void DeleteNote(Note noteToDelete)
 {
     Note n = GetNote(noteToDelete.Id);
     this.DeleteObject(n);
     this.SaveChanges();
 }

Et voilà, à partir de maintenant on a notre application prête à être déployer sur Azure, mais je ne le ferais pas pour ce projet vu que je ne pense pas que je le laisserais indéfiniment en place …

Le code source de l’application :

image

Il ne faut pas oublier qu’Azure n’est pas un produit fini, il reste encore des évolutions qui me semblent majeures à mettre en place, par exemple les tables relationnelles qui pour le moment n’existe pas ! Enfin, j’essayerai de vous faire un topo courant Juillet avec les différentes mises à jour qui arrivent, ainsi que les tarifs !

Un grand merci à Aymeric de la communauté Windows Azure sur ZeCloud pour m’avoir présenté la plateforme. D’ailleurs si vous voulez venir aux Azure Camp n’hésitez pas  !

Remonter

Le design pattern : MVVM

MAI18

Bon avant de commencer, désolé de vous avoir fait attendre pour cet article. Promis, je vais essayer de me rattraper d'ici les prochaines semaines ... Enfin il faudra venir voir pour savoir ! Alors le deisgn pattern MVVM signifie pour commencer Model View ViewModel, alors j'espère que cet acronyme vous rappelle celui pour le MVC (Model View Controller). Celui ci a été crée principalement pour les applications en WPF ou en Silverlight, voir plus généralement les applications supportant un moteur de "binding" avancé. A quand le MVVM dans une application en JavaFX (Patrick si tu passes par là) Donc, à mon habitude je vais vous présenter une application implémentant ce design pattern. Donc contrairement à ce que j'avais prévu, cette application contient une liste de personne ou l'on peut afficher leurs détails. Et oui, l'application gérant les FluxRSS n'a pas été faite, puisque sans Internet la gestion de ces flux était légèrement moins pratique. Donc voici l'application au final : On ne pourra s'empêcher le voir le côté design très avancée de celle ci. Quand à la solution, voici à quoi elle ressemble, ce qui est d'ailleurs la partie intéressante de la démonstration. Donc ici, on peut voir le "Model" situé dans le projet "MVVM.Data", la "View" dans le "MVVM.Client", et le "ViewModel" dans le projet "MVVM.ViewModel" Bon alors, vu que j'ai décidé de parler des projets les plus intéressants, on va juste décrire les projets "MVVM.Client" et "MVVM.ViewModel" puisque l'utilisation du moteur de Binding se fait entièrement entre ces deux projets. Donc la partie "ViewModel", regardons de plus près la classe ViewModelBase public abstract class ViewModelBase : DependencyObject { public abstract void OnViewReady(); public abstract void OnViewClosed(); } On peut donc voir notre classe ViewModelBase dérivant de la classe DependencyObject, voyons donc maintenant notre classe LstPersonsViewModel public class LstPersonsViewModel : ViewModelBase {

public override void OnViewReady()

{

Personnes = PersonRepository.LoadPerson();

}

public override void OnViewClosed()

{

}

public IEnumerable<Personne> Personnes

{

get { return (IEnumerable<Personne>)GetValue(PersonnesProperty); } set { SetValue(PersonnesProperty, value); }

}

public static readonly DependencyProperty PersonnesProperty = DependencyProperty.Register("Personnes", typeof(IEnumerable<Personne>), typeof(LstPersonsViewModel), new UIPropertyMetadata(null));

public Personne SelectedPersonne

{

get { return (Personne)GetValue(SelectedPersonneProperty); }

set { SetValue(SelectedPersonneProperty, value); }

}

public static readonly DependencyProperty SelectedPersonneProperty =

DependencyProperty.Register("SelectedPersonne", typeof(Personne), typeof(LstPersonsViewModel), new UIPropertyMetadata(null)); } Cette classe implémente comme il se doit notre classe abstraite, on peut donc voir nos deux méthodes, celle pour le OnViewReady() permet d'initialiser nos données, de les charger depuis la base, ou comme ici en dur depuis notre projet "MVVM.Repository" On déclare ici, de plus deux DependencyProperty afin de pouvoir les injecter dans notre vue par la suite. Passons maintenant à la vue. Notre vue est basé sur un ControlBase générique contenant un objet dérivant de notre ViewModelBase, et on lie les méthodes OnViewReady() et OnViewClose() à ce control : public abstract class ControlBase<TViewModel> : UserControl where TViewModel : ViewModelBase {

public TViewModel ViewModel { get; protected set; }

public ControlBase()

{

Loaded += delegate { if (ViewModel != null) ViewModel.OnViewReady(); };

Unloaded += delegate { if (ViewModel != null) ViewModel.OnViewClosed(); };

} } Les deux classes DelegateCommand et DelegateCommandWithParam permettent d'appeler différentes command depuis la vue grâce au Controller. Je vous laisse donc regarder ces deux classes, qui implémentent l'interface ICommand. Notre classe Controller maintenant : public static ICommand NavigateUri {

get { return new DelegateCommandWithParam<Uri>(OnNavigateUri); } } private static void OnNavigateUri(Uri uri) {

Process.Start(new ProcessStartInfo(uri.AbsoluteUri)); } public static ICommand StartApplication {

get { return new DelegateCommand(OnStartApplication); } } private static void OnStartApplication() {

Window window = Application.Current.MainWindow; if (window == null)

window = new Window1();

if (window.Visibility != Visibility.Visible)

{

window.Dispatcher.BeginInvoke(

DispatcherPriority.Send, new Action(() => window.Show()));

}

Application.Current.MainWindow = window;

} } On peut voir ici la déclaration de deux commandes, la première sert pour naviguer vers les différents sites des personnes présentes dans l'application. et la deuxième permet de gérer le démarrage de l'application. Maintenant voici la partie Xaml de notre application : <local:ControlBase

x:Class="MVVM.Client.LstPersons"

x:TypeArguments="viewModel:LstPersonsViewModel"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:local="clr-namespace:MVVM.Client"

xmlns:viewModel="clr-namespace:MVVM.ViewModel;assembly=MVVM.ViewModel"> <Grid>

<Grid.RowDefinitions>

<RowDefinition Height="250" />

<RowDefinition Height="Auto" />

</Grid.RowDefinitions>

<ListView x:Name="lst_Personnes" ItemsSource="{Binding Personnes}"

IsSynchronizedWithCurrentItem="True" SelectedItem="{Binding SelectedPersonne}" >

<ListView.ItemTemplate>

<DataTemplate>

<StackPanel Orientation="Horizontal">

<TextBlock Text="{Binding Prenom}" />

<TextBlock Text="{Binding Nom}" Margin="5,0,0,0" />

</StackPanel>

</DataTemplate>

</ListView.ItemTemplate>

</ListView>

<Grid Grid.Row="1">

<Grid.RowDefinitions>

<RowDefinition Height="Auto" />

<RowDefinition Height="Auto" />

<RowDefinition Height="Auto" />

</Grid.RowDefinitions>

<StackPanel Orientation="Horizontal">

<TextBlock Text="{Binding SelectedPersonne.Prenom}" />

<TextBlock Text="{Binding SelectedPersonne.Nom}" Margin="5,0,5,0" />

</StackPanel>

<TextBlock Grid.Row="1">

<Hyperlink Command="local:Controller.NavigateUri" CommandParameter="{Binding SelectedPersonne.SiteInternet}" >

<TextBlock Text="Site Internet" />

</Hyperlink>

</TextBlock>

<TextBlock Grid.Row="2" Text="{Binding SelectedPersonne.NomEntreprise}" />

</Grid> </Grid> </local:ControlBase> Donc maintenant regardons uniquement les parties intéressantes de ce fichier Xaml, on intègre les deux namespaces "MVVM.Client" et "MVVM.ViewModel", et on ajoute bien entendu le ControlBase et son argument pour la création de ce fichier Xaml, afin qu'on puisse profiter de notre classe précédemment créer. Maintenant passons aux commandes, celle de démarrage je vous l'épargne pour le moment, mais elle intervient lors du démarrage de l'application "OnStartupApplication" dans App.xaml.cs. Donc on voit l'appelle d'une commande avec paramètre dans le composant Hyperlink. Command="local:Controller.NavigateUri" Ici, on voit l'appel de notre commande, puis on passe notre paramètre avec cet attribut : CommandParameter="{Binding SelectedPersonne.SiteInternet}" Pour le reste, en fait la classe DelegateCommandWithParam s'occupe de relayer et d'exécuter cette action. Edit : Alors depuis que j'ai installé Visual Studio 2010, autant profiter de ces fonctionnalités. Voici un schéma des différentes liaisons entre mes Namespaces, j'ai seulement laissé ceux en liaison avec le MVVM bien entendu. Schéma liaison Namespace Alors une fois n'est pas coutume, voici les sources de la solution:

Toutefois, je souhaite remercier Fabrice Marguerie (MVP) pour ces différents liens sur le MVVM qu'il m'a fourni, ainsi qu'une application fortement détaillé implémentant ce design pattern.
Remonter

L’ASP.Net MVC et Silverlight

MARS16

Alors un nouvel article, après un petit moment d'absence.

Cet article va porter sur le modèle MVC dans un site ASP.Net et la possibilité d'intégrer Silverlight dans l'application, sans pour autant modifier l'architecture de l'application.

Alors on va commencer par créer l'application ASP.Net MVC sans le module Silverlight, pour la démonstration, on va créer une application gérant des notes.

Bien entendu, le code source de l'application sera en lien à la fin de cet article.

Donc la création du projet ASP.Net MVC :

alt

Dans cet exemple, on ne va pas utiliser les tests unitaires. On arrive donc à une architecture de type MVC classique.

alt

Maintenant nous allons créer la base de données que nous allons utiliser dans cet application.

Pour ajouter la base de données, nous avons soit le choix de la mettre dans la solution où alors héberger cette base au travers un moteur de base de données. Pour la démonstration, nous allons utiliser Sql Serveur 2008.

On crée donc la base NotesDB comme ci-dessous :

alt

Dans cet article, nous allons Entity Framework afin de relier notre base de données à notre application, on obtient donc un modèle de données de ce type.

alt

On rajoute bien entendu notre fichier « edmx » dans la partie « Models » de l'application.

Maintenant que nous avons relié notre application à la base de données, il nous faut créer les différentes méthodes pour utiliser au mieux cette base. Nous allons donc créer une interface « INoteService » et une classe « NoteService » qui implémentera l'interface précédente. Ci-dessous le code de l'interface.


public interface INoteService

{


IEnumerable<Note> ListNotes();


Note GetNote(int id);


void CreateNote(Note noteToCreate);


void EditNote(Note noteToEdit);


void DeleteNote(Note noteToDelete);

}

Afin de ne pas surcharger l'article, je ne mets pas le code de la classe, mais elle utilise avant tout la syntaxe Linq, et les différentes propriétés d'Entity Framework.

Passons maintenant à la partie « C » de MVC J. On rajoute donc un contrôleur à notre application.

alt

Alors nous allons créer un « NoteController.cs » qui regroupera nos différents contrôleurs, ci-dessous les constructeurs de la classe, et le contrôleur pour la page Index.


public class NoteController : Controller

{


private INoteService _service;


public NoteController() : this(new NoteService()) { }


public NoteController(NoteService service)

{

_service = service;

}


public ActionResult Index()

{
return View(_service.ListNotes());

}

Pour la création des vues, nous allons utiliser le simple clic droit sur la méthode Index.

alt

Donc pour les autres vues, on utilisera le même principe. Faisons un point sur l'architecture du projet actuellement :

alt

Nous avons donc nos 3 contrôleurs (MVC) :

  • Account
  • Home
  • Note

Notre partie modèle (MVC) contenant :

  • L'accès à la base de données via Entity Framework
  • Notre classe, et son interface, pour accéder à la table Note

Notre partie (MVC) vue contenant pour chacun des contrôleurs :

  • Les différentes vues associés : Par exemple, pour nos Notes, nous avons « Index », « Create », « Edit », « Delete »

De plus nous avons aussi le dossier « Shared » qui contient les différentes pages d'erreur, puisque c'est toujours plus jolie qu'une fameuse page jaune, et aussi les différentes MasterPage de l'application.

Maintenant passons à l'intégration de Silverlight dans ce projet. Comme on peut le voir ci-dessus, le principe de l'ASP.Net MVC injecte des données dans la page, afin qu'elle soit affichées et traitées dans l'application. On peut donc chercher comment ajouter ces données dans l'application Silverlight, cependant les personnes ayant développé le framework ASP.Net MVC ont pensé à nous les développeurs Silverlight, puisqu'il nous ont fournit la classe « JsonResult ». Donc pour passer les données à l'application Silverlight nous allons ajouter une méthode au contrôleur.


public ActionResult List()

{

return Json(_service.ListNotes());

}

Cette méthode va nous permettre de sérialiser la liste des notes au travers du navigateur.

Passons à la création du projet Silverlight que nous nommerons « SLNotes » (oui je sais, je fais dans l'original aujourd'hui)

alt

On relie notre application Silverlight dans notre projet « Notes ». Maintenant passons à la création de l'application, cependant éviter que cet article ne soit trop long, je vais juste créer la partie qui affiche la liste des Notes. Il nous faut donc pour cela une « ListBox », dont voici le code :


<ListBox x:Name="lstNotes" ItemsSource="{Binding}">


<ListBox.ItemTemplate>


<DataTemplate>


<StackPanel Orientation="Horizontal">


<TextBlock Text="{Binding DateSaisie}" Margin="5" />


<TextBlock Text="{Binding Libelle}" Margin="5" />


</StackPanel>


</DataTemplate>


</ListBox.ItemTemplate>


</ListBox>

Maintenant passons à la partie du code behind qui elle sera nettement plus interessante, du moins à mon goût J

void Page_Loaded(object sender, RoutedEventArgs e)

{


WebClient wc = new WebClient();

wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);

wc.OpenReadAsync(new Uri("http://localhost:1295/Note/List"));

}


void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)

{


DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(List<Note>));

List<Note> notes = (List<Note>)json.ReadObject(e.Result);

lstNotes.DataContext = notes;

}

Donc dans le Page Load, on retrouve nos objets que nous avons sérialiser tous à l'heure. Puis par la suite, lorsque le traitement est terminé nous ajoutons nos objets à notre liste.

Maintenant que l'application Silverlight est prête, il faut l'ajouter dans notre application. Afin de ne pas recréer une énième vue, nous allons ajouter notre objet Silverlight dans la page Index

<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="ClientBin/SLNotes.xap" />

<param name="onerror" value="onSilverlightError" />

<param name="background" value="white" />
<param name="minRuntimeVersion" value="2.0.31005.0" />

<param name="autoUpgrade" value="true" />
<a href="http://go.microsoft.com/fwlink/?LinkID=124807"
style="text-decoration: none;">
<img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight"
style="border-style: none" />
</a></object>

Comme on peut le voir on utilise la balise object pour intégrer notre partie en Silverlight et non la balise <asp:Silverlight /> qui demande quand à elle de rajouter un Script Manager ainsi qu'un formulaire, ce qui n'est pas utile dans cette application.

altOn voit ici dans le résultat que nous avons bien notre Note qui s'affiche dans la ListBox.

Donc pour conclure cet article, ce que je peux c'est que l'intégration d'une application Silverlight à l'intérieur d'un site en ASP.Net MVC peut enrichir de façon très conséquente vos applications.

Cependant un point négatif que j'ai repéré, c'est qu'il faut soit relier les entités à nos applications Silverlight via WCF par exemple, ou il faut recopier intégralement les entités à l'intérieur de nos applications Silverlight, comme j'ai du le faire dans ce cas ci.

Et voilà comme promi le code source de l'application (note : il faudra sûrement modifier le port de votre Visual Studio ou alors modifier le code source pour l'application Silverlight)

alt

Remonter