Laden...

Repository und IDisposable der Verwalteten Objekte

Letzter Beitrag vor einem Jahr 5 Posts 702 Views
Repository und IDisposable der Verwalteten Objekte

Hallo,

ich habe folgende Frage:

ich habe eine Klasse welche die Kommunikationsobjekte zu an den Rechner angeschlossen Sensoren verwaltet. Diese Objekte implementieren IDisposable. Wird ein Sensor angeschlossen oder entfernt, wird ein Event ausgelöst. Nun frage ich mich, wie ich am besten das Aufrufen von Dispose() der Kommunikationsobjekte gestalte.

Wenn jetzt die darüberliegende Klasse eine Objekt von der Repository abfragt:

public interface IRepository
{
    event EventHandler<ChannelEventArgs>? ChannelAdded;
    event EventHandler<ChannelEventArgs>? ChannelRemoved;
    
    ICommunicationChannel? GetChannel(string id);
    
    string[] Channels;
}

public sealed class ChannelEventArgs : EventArgs
{
    public string Id { get; }
    
    public ChannelEventArgs(string id)
    {
        Id = id;	
    }
}

ICommunicationChannel? channel = _Repsitory.GetChannel(id);

wer ist dann für den Aufruf von Dispose() zuständig? Ich würde jetzt sagen das Repository. Sollte der Channel dann ein Disposed-Event haben?

Danke und Grüße,

Alex

Final no hay nada más

Hallo ill_son

Bin mir nicht sicher ob ich den Aufbau richtig verstanden habe. Ich denke es fehlen noch Informationen um die Fragen zu beantworten.

Wo werden denn die Channel-Objekte (??) gehalten und wo werden sie erzeugt? Im Repository?

wer ist dann für den Aufruf von Dispose() zuständig?  Ich würde jetzt sagen das Repository.

Dann ja.

Sollte der Channel dann ein Disposed-Event haben?

Nur wenn es benötigt wird.

Gruss
Alf

Hallo Alf,

danke für deine Antwort. Die Repository hat einen Scanner, der die Sensoren sucht und bei einem detektierten Sensor einen Channel erzeugt. Die Channel-Objekte entstehen also im Scanner. Ich habe jetzt folgendes gemacht, ich habe im Scanner eine Methode

Task<byte[]?> SendWaitResponse(string id, byte[] data, IProgress<int>? progress = null);

implementiert. Dann kann ich anhand der Id den Kanal suchen und die Daten schicken und lesen. Der Scanner hält die Channel-Objekte und kann diese dann auch aufräumen.

Final no hay nada más

Auch wenn es ähnlich ist; ein Repository (als Naming) hat andere Aufgaben als das Verwalten von Verbindungen.
Repositories sind namentlich eher Data Store zugeordnet.

Das hier würde (eher) unter den Namen "ChannelHub" fallen oder sowas.


Wenn Dein Repository  nur für den Aufbau verantwortlich sein soll, dann braucht es auch keine Kenntnis über Dispose und Co.
Ich seh hier auch nur einen GetChannel.

Soll es aber eher als ganze Verwaltungseinheit dienen, dann muss das komplexer aufgebaut werden, damit das Repository überhaupt über die verschiedenen States eins Channels informiert werden kann. Das bedeutet alle Aktionen müssen zwingend immer über das Repository und nicht über den Channel laufen (oder es muss aktiv informiert werden, zB über Events).

Nun frage ich mich, wie ich am besten das Aufrufen von Dispose() der Kommunikationsobjekte gestalte.

Ist also eher die Frage, was Du überhaupt erreichen willst.

Hallo Abt,

danke für deine Antwort. Ich habe es jetzt so gelöst, dass eine Methode

IChannelCommunication? GetChannelCommunication(string id);		
    
public interface IChannelCommunication
{
    bool IsConnected { get; }
    string Id { get; }
    void Write(byte[] data);
    byte[] ReadPackage();
    void Clear();
}

ein Kommunikations-Objekt zurückgibt, das alles beinhaltet, um mit dem Sensor zu reden, aber die Verbindungsfunktionalitat nicht mit veröffentlicht. Die manage ich dann im "Hub".

Grüße, Alex

Final no hay nada más