2010-10-12 7 views
2

Je travaille sur un projet modulaire composé de plusieurs capteurs, chacun héritant d'une classe abstraite Sensor. Pour configurer chaque capteur, j'ai commencé à ajouter un panneau de contrôle utilisateur pour chaque capteur (hérite de UserControl), qui est chargé à l'exécution et affiché dans un panneau par l'application appelante. Mais ensuite je me suis rendu compte que pour changer les propriétés du capteur, la classe Control doit avoir accès à ces propriétés ou le capteur doit s'abonner aux changements de configuration dans le contrôle utilisateur. Cela ne semble pas correct, cependant, le contrôle devrait être contrôlant le capteur.UserControl dans la classe par rapport à la classe dans UserControl pour Windows Forms

Quelle est la solution la plus élégante pour contrôler mes capteurs sans créer un délégué?

Dois-je continuer sur la voie de:

class TestSensor : Sensor 
{ 
    public UserControl ControlPanel { get; } // returns a TestSensorControl 
    // ... 
} 

ou si mes capteurs sont créés à l'intérieur de mes commandes:

class TestSensorControl : UserControl 
{ 
    private TestSensor _sensor; 
    public TestSensor Sensor { 
     get { 
      return _sensor; 
     } 
    } 

    // ... 
} 

Les capteurs sont responsables de la vérification des changements d'état et de la communication à l'appel application en signalant un événement OnSensorEvent(...).

Alternativement, ma classe de base Sensor pourrait hériter de UserControl, et mon SensorControl peut hériter de cela à la place, éliminant le besoin d'une classe de contrôle intermédiaire.

+0

+ Ceci est une très bonne question. – Sabuncu

Répondre

2

Id passe le capteur en contrôle et a un processus d'abonnement.

+0

+1 Hmm, j'ai considéré ceci. Mais si ma classe Sensor se transmet à son contrôle qui est contenu en elle-même, par exemple. SensorControl (this), il semble circulaire ou redondant? Avoir le capteur à l'intérieur du contrôle signifie que je n'ai pas besoin d'ajouter d'autres méthodes d'abonnement. –

+1

Je n'aurai pas le contrôle à l'intérieur du capteur. Je voudrais que le contrôle enveloppe un capteur ... lorsque vous ajoutez un capteur à la commande, le contrôle peut changer les valeurs des capteurs. Si vous voulez que le capteur puisse effectuer le contrôle, j'utiliserais des événements. la commande peut alors contenir une logique de décision et éventuellement ajuster le capteur. J'ai tendance à coder des choses comme ça contre les interfaces. C'est à dire que j'écrirais une interface pour le capteur. –

+0

Je ne veux pas que le capteur affecte le contrôle, mais j'aimerais que le contrôle s'abonne aux événements de capteur comme l'application appelante. –

1

Il semble que vous devriez garder votre classe de capteur non-ui qui peut être utilisée par les contrôleurs ui et non-ui, et pas besoin de créer un UserControl de base pour chaque initialisation de la classe Sensor.

Je suggère d'utiliser des contrôleurs hérités (les capteurs sont créés dans les contrôleurs). Vous pouvez créer un élément générique class SensorControl : UserControl et hériter de cette classe class TestSensorControl : SensorControl. Cela peut sauver du temps et du code dublicats.

Vous pouvez définir un type de capteur abstrait dans SensorControl et affecter des événements dans le constructeur à ignorer.

Bonne chance

+0

D'accord, il est préférable de garder mon capteur non-ui seul afin que je puisse l'utiliser dans d'autres applications. D'un autre côté, puisque j'utilise StructureMap for IoC, existe-t-il une manière élégante d'utiliser IoC pour fournir (via une usine?) Le bon type de UserControl en fonction du type de capteur? Ou est-ce mieux que chaque capteur dérivé renvoie le bon type? –

+0

Yep ObjectFactory devrait fonctionner dans ce cas. \t Vous pouvez également ajouter à votre classe SensorControl une fonction statique telle que: 'SensorControl statique Create (Sensor s) {}' et renvoyer le type de SensorControl correct basé sur Sensor dans cette fonction. –