J'aurais besoin de savoir si qqn utilise le CAB avec les WorkItemExtension et des controllers
J'ai googlé mon problème mais personne semble s'être rendu où je suis.
Si qqn l'utilise laissé moi savoir. Il y as pas beaucoup d'aide sur ce sujet!!
Merci
J'aurais besoin de savoir si qqn utilise le CAB avec les WorkItemExtension et des controllers
J'ai googlé mon problème mais personne semble s'être rendu où je suis.
Si qqn l'utilise laissé moi savoir. Il y as pas beaucoup d'aide sur ce sujet!!
Merci
petit veinard va
Je travaille sur un projet ou l'ancien developpeur à utiliser les CAB de microsoft.
J'ai mis un peu de temps (1 h) pour comprendre comment cela fonctionnait et j'ai envie de dire la chose suivante :
QUEL BEAU MERDIER CE TRUC
Concrètement... nous l'utilisons dans le cadre suivant : Une IHM pour une application et des module (controler, view, etc) peuvent venir s'y intégrer.
L'interet est clair, si tu développes un module qui possède tout ce qu'il faut, il s'intègre en ajoutant juste son nom dans un fichier XML décrivant les modules à charger
Par contre, au niveau de la gestion des evenements, c'est pratique d'un coté, mais MEGA chiant de l'autre. Il faut déclarer les Evenements inter module ou inter-element de module dans une liste de string. ET ensuite, pour lever un evenement, tu passes par l'interface de base du CAB. pour s'abonner à un evenement, il faut utiliser une décoration de la méthode pour que celle ci soit "connecté" à l'evenement
Bref, tu auras compris que cela peut etre interessant dans le cadre ou tu pourrais t'abonner à un event qu'un autre module pourrait ou pas suivant sa présence exposer, mais bon, le mécanisme est assez lourd je trouve.
Quand tu regardes le code généré, tu as environ 10 DLL rien que pour le CAB (je trouve cela volumineux).
Ensuite, le CAB est utile pour nous parce qu'on espérait développer "moultes" applications identiques en terme d'IHM.
Au final, j'aurais tendance à dire qu'avant que le CAB se justifie pleinement en terme de gain de temps, il faut vraiment des conditions que je ne rencontre pas dans mon projet.
Personnellement, je trouve que la gestion par plug-in (qui est voisine finalement du concept CAB) est plus simple, plus pratique et surtout beaucoup plus rapide à mettre en oeuvre sans avoir à installer le CAB (car il te faut l'installer si tu veux pouvoir profiter des extensions qu'il amène à Visual Studio (bouton droit Add Cab UI, etc...).
Bref, je reste très partagé quand à l'interet des CAB UI de microsoft.
En tout cas, il est clair que dans l'application que j'ai, j'aurais été bien plus vite en m'en passant (maintenant, je n'en suis que le chef de projet qui recupère le boulot effectué par quelqu'un qui a quitté la société
Si tu as des questions supplémentaires, n'hésites pas. J'essayerais d'y repondre en fonction de mon temps et disponibilité
PS : Etant en vacances à compter de demain et sans liaison internet durant une semaine, n'attends pas une réactivité de ma part avant dimanche en 8![]()
Salut theMonz31, le CAB est merveilleux après que tu sache comment bien l'utiliser. C'est tellement facile de se perdre et de tout abandonné.
Pour ce qui est de l'eventBroker, si tu enrégistre ton event au niveau du parent, tu peux facilement te subscribe dessus dans l'enfant. (La structure des workitems est tres importante). C'est tellement merveilleux de seulement a avoir a mettre
seulement pour se faire avertir!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 [EventSubscription(Dispatch.Resources.EventTopics.FlightUpdated)] public void OnFlightUpdated(object sender, Dispatch.Common.EventArgs.EntitySavedEventArgs<AirCreebec.Services.Dispatch.Model.Flight> e) { Services.Dispatch.Model.Flight existingFlight = Flights.Find(item => item.FlightNumber == e.Data.FlightNumber); if (existingFlight == null) return; e.Data.CopyTo(existingFlight); }
Voila, j'ai une erreur que je ne comprend trop.
Dans un module (Dispatch) jai un workitem qui fait ce qu'il as a faire. Dans un autre module, j'extensionne le Dispatch comme ceci
Ce workitemExtension affiche un smartpart
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 [WorkItemExtension(typeof(Dispatch.MainWorkItem))] public class WorkItemExtension : Shell.Common.WorkItemExtensionBase<Dispatch.MainWorkItem> { protected override void OnInitialized() { base.OnInitialized(); ExtendExplorerBar(); ExtendMenuItem(); } ...
Le propriété WorkItem est "shadowé" dans ma base comme ceci
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 public void FlightsItemClick(object sender, EventArgs e) { WorkItem.ShowSmartPart(FlightsList); } private Views.FlightsList _flightsList ; public Views.FlightsList FlightsList { get { if (_flightsList == null) _flightsList = WorkItem.SmartPart.AddNew<Views.FlightsList>(); return _flightsList; } }
Mais voila que je ne peux pas faire de [ServiceDependency] dans mes SmartPart pour me faire injecté mon WorkitemExtension
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public class WorkItemExtensionBase<TWorkItem> : Microsoft.Practices.CompositeUI.WorkItemExtension where TWorkItem : WorkItemBase { protected new TWorkItem WorkItem { get { return (TWorkItem)base.WorkItem; } } }
Ce bout de code "abrégé" me faire faire cette exception
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 [ServiceDependency] public Dispath.Schedules.WorkItemExtension WorkItemExtension { get { ;} set { ;} }
Bref, tout ca pour dire que je ne peux pas injection mes WorkItemExtension dans mes smartparts. Je ne comprend pas trop la raison. Ca fais une couple de jours que je suis "pogné" avec ce problème qui m'empêche d'avancé car tout est en "plug-in" et c'est LA FACON de faire du module extension avec le CABService Dispatch.Schedules.WorkItemExtension is not available in the current context.
J'ai enfin résolu mon problème. On ne peux définitivement pas injecté un WorkItemExtension.
Voila comment faire
Il faut se créé un WorkItem qui va géré le module au lieu d'utiliser l'extension pour la gérance. L'extension sert seulement de hooking.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 [WorkItemExtension(typeof(Dispatch.MainWorkItem))] public class WorkItemExtension : Shell.Common.WorkItemExtensionBase<Dispatch.MainWorkItem> { protected override void OnInitialized() { base.OnInitialized(); MainWorkItem = WorkItem.WorkItems.AddNew<MainWorkItem>(); } private MainWorkItem mainWorkItem; private MainWorkItem MainWorkItem { get { return mainWorkItem; } set { mainWorkItem = value; } } protected override void OnRunStarted() { MainWorkItem.Run(WorkItem.Workspace); base.OnRunStarted(); } }
Partager